~starkingdoms/starkingdoms

f7c45924e683dfb1750d979d9677c2c15f5251c9 — c0repwn3r 2 years ago a4407c9 + 6f32ab8
Merge remote-tracking branch 'origin/master'
5 files changed, 47 insertions(+), 15 deletions(-)

M client/src/gateway.ts
M client/src/index.ts
M server/src/entity.rs
M server/src/manager.rs
M server/src/timer.rs
M client/src/gateway.ts => client/src/gateway.ts +2 -2
@@ 72,7 72,7 @@ export async function gateway_connect(gateway_url: string, username: string): Ga
    let handshake_start_msg;
    if (global.can_beam_out) {
        handshake_start_msg = MessageC2SHello.encode({
            version: 2,
            version: 3,
            requestedUsername: username,
            nextState: State.Play,
            user: window.localStorage.getItem("user")!,


@@ 80,7 80,7 @@ export async function gateway_connect(gateway_url: string, username: string): Ga
        }).finish();
    } else {
        handshake_start_msg = MessageC2SHello.encode({
            version: 2,
            version: 3,
            requestedUsername: username,
            nextState: State.Play,
            // @ts-ignore

M client/src/index.ts => client/src/index.ts +4 -5
@@ 212,23 212,22 @@ async function client_main(server: string, username: string, texture_quality: st

        for (let i = 0; i < global.modules.length; i++) {
            let module = global.modules[i];
            console.log(module);
            // @ts-ignore
            let tex = global.spritesheet!["frames"][module_type_to_tex_id(module.moduleType)];

            global.context.save();

            global.context.rotate(module.rotation);
            global.context.translate(module.x - global.me!.x, module.y - global.me!.y);

            global.context.translate(module.x, module.y);
            global.context.rotate(module.rotation);

            global.context.drawImage(global.spritesheet_img!,
                                     tex.frame.x,
                                     tex.frame.y,
                                     tex.frame.w,
                                     tex.frame.h,
                                     (module.x - 25 - global.me?.x!),
                                     (module.y - 25 - global.me?.y!), 50, 50);
                                     -25,
                                     -25, 50, 50);

            global.context.restore();
        }

M server/src/entity.rs => server/src/entity.rs +10 -0
@@ 97,6 97,16 @@ impl EntityHandler {
        }
        module_count
    }
    pub fn get_from_module(&self, p_module: &Module) -> Option<EntityId> {
        for (id, entity) in self.entities.iter() {
            if let Entity::Module(module) = entity {
                if module.handle == p_module.handle {
                    return Some(*id);
                }
            }
        }
        None
    }

    pub fn gravity(&self, position: (f64, f64), mass: f64) -> (f64, f64) {
        let mut direction = Vector2::zeros();

M server/src/manager.rs => server/src/manager.rs +1 -0
@@ 37,6 37,7 @@ impl Player {
pub struct Module {
    pub handle: RigidBodyHandle,
    pub module_type: ModuleType,
    pub lifetime: f64,
}

#[derive(Default, Clone)]

M server/src/timer.rs => server/src/timer.rs +30 -8
@@ 2,7 2,7 @@ use std::{time::Duration, sync::Arc, f64::consts::PI};
use log::{debug, warn};
use nalgebra::{vector, point};
use rand::Rng;
use rapier2d_f64::prelude::{PhysicsPipeline, ColliderBuilder, RigidBodyBuilder};
use rapier2d_f64::prelude::{PhysicsPipeline, ColliderBuilder, RigidBodyBuilder, MassProperties};
use async_std::sync::RwLock;
use async_std::task::sleep;
use starkingdoms_protocol::{player::Player, planet::PlanetType, module::ModuleType};


@@ 13,7 13,7 @@ use crate::orbit::orbit::{calculate_point_on_orbit, calculate_world_position_of_

pub const ROTATIONAL_FORCE: f64 = 100.0;
pub const LATERAL_FORCE: f64 = 100.0;
pub const MODULE_SPAWN: f64 = 1000.0;
pub const MODULE_SPAWN: f64 = 3.0;
pub const MODULE_MAX: u32 = 10;

pub async fn timer_main(mgr: ClientManager, physics_data_orig: Arc<RwLock<PhysicsData>>, entities: Arc<RwLock<EntityHandler>>) {


@@ 66,14 66,16 @@ pub async fn timer_main(mgr: ClientManager, physics_data_orig: Arc<RwLock<Physic
        let mut protocol_players = vec![];

        {
            if module_timer > 1.0 && entities.read().await.get_module_count() < MODULE_MAX {
                debug!("module spawn");
            if module_timer > MODULE_SPAWN && entities.read().await.get_module_count() < MODULE_MAX {
                module_timer = 0.;

                let mut rigid_body_set = physics_data.rigid_body_set.clone();
                let mut collider_set = physics_data.collider_set.clone();

                let module_collider = ColliderBuilder::cuboid(25. / SCALE, 25. / SCALE);
                let module_collider = ColliderBuilder::cuboid(18.75 / SCALE, 23.4375 / SCALE)
                    .translation(vector![0.0, 1.5625 / SCALE])
                    .mass_properties(MassProperties::new(point![0.0, 0.0], 120.0, 122500.0))
                    .build();
                let angle: f64 = {
                    let mut rng = rand::thread_rng();
                    rng.gen::<f64>() * PI * 2.


@@ 90,17 92,37 @@ pub async fn timer_main(mgr: ClientManager, physics_data_orig: Arc<RwLock<Physic
                let module = Module {
                    handle: module_handler,
                    module_type: ModuleType::Cargo,
                    lifetime: 0.0,
                };
                entities.write().await.entities.insert(get_entity_id(), Entity::Module(module));
            }
            for module in entities.read().await.get_modules().iter() {
            let mut entities = entities.write().await;
            for mut module in entities.get_modules().iter_mut() {
                let module_handle = module.handle;
                let module_body = physics_data.rigid_body_set.get_mut(module_handle).unwrap();
                module_body.reset_forces(true);
                module_body.reset_torques(true);
                let planets = entities.read().await;
                let grav_force = planets.gravity((module_body.translation().x, module_body.translation().y), module_body.mass());
                let grav_force = entities.gravity((module_body.translation().x, module_body.translation().y), module_body.mass());
                module_body.apply_impulse(vector![grav_force.0, grav_force.1], true);
                let id = entities.get_from_module(module).unwrap();
                if let Entity::Module(p_module) = entities.entities.get_mut(&id).unwrap() {
                    p_module.lifetime += 5./1000.;
                }
                if module.lifetime > 80. {
                    let mut rigid_body_set = physics_data.rigid_body_set.clone();
                    let mut island_manager = physics_data.island_manager.clone();
                    let mut collider_set = physics_data.collider_set.clone();
                    let mut impulse_joint_set = physics_data.impulse_joint_set.clone();
                    let mut multibody_joint_set = physics_data.multibody_joint_set.clone();
                    rigid_body_set.remove(module.handle, &mut island_manager, &mut collider_set,
                                            &mut impulse_joint_set, &mut multibody_joint_set, true);
                    physics_data.rigid_body_set = rigid_body_set;
                    physics_data.collider_set = collider_set;
                    physics_data.island_manager = island_manager;
                    physics_data.impulse_joint_set = impulse_joint_set;
                    physics_data.multibody_joint_set = multibody_joint_set;
                    entities.entities.remove(&id);
                }
            }
        }