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);
+ }
}
}