From 68ecfba291be2e95b4ed90d8f8c118d15989f0a7 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 6 Aug 2020 13:17:38 -0500 Subject: [PATCH] Projectile speed is no longer hard-coded. --- common/src/comp/ability.rs | 12 ++++++++++++ common/src/comp/inventory/item/tool.rs | 7 +++++++ common/src/event.rs | 1 + common/src/states/basic_ranged.rs | 5 +++++ common/src/states/charged_ranged.rs | 26 ++++++++++++++++++++------ server/src/events/entity_creation.rs | 3 ++- server/src/events/mod.rs | 3 ++- 7 files changed, 49 insertions(+), 8 deletions(-) diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs index e921cc1767..2477760ea7 100644 --- a/common/src/comp/ability.rs +++ b/common/src/comp/ability.rs @@ -63,6 +63,7 @@ pub enum CharacterAbility { projectile_body: Body, projectile_light: Option, projectile_gravity: Option, + projectile_speed: f32, }, Boost { duration: Duration, @@ -105,6 +106,9 @@ pub enum CharacterAbility { recover_duration: Duration, projectile_body: Body, projectile_light: Option, + projectile_gravity: Option, + initial_projectile_speed: f32, + max_projectile_speed: f32, }, } @@ -272,6 +276,7 @@ impl From<&CharacterAbility> for CharacterState { projectile_body, projectile_light, projectile_gravity, + projectile_speed, energy_cost: _, } => CharacterState::BasicRanged(basic_ranged::Data { exhausted: false, @@ -283,6 +288,7 @@ impl From<&CharacterAbility> for CharacterState { projectile_body: *projectile_body, projectile_light: *projectile_light, projectile_gravity: *projectile_gravity, + projectile_speed: *projectile_speed, }), CharacterAbility::Boost { duration, only_up } => CharacterState::Boost(boost::Data { duration: *duration, @@ -366,6 +372,9 @@ impl From<&CharacterAbility> for CharacterState { recover_duration, projectile_body, projectile_light, + projectile_gravity, + initial_projectile_speed, + max_projectile_speed, } => CharacterState::ChargedRanged(charged_ranged::Data { exhausted: false, energy_drain: *energy_drain, @@ -379,6 +388,9 @@ impl From<&CharacterAbility> for CharacterState { recover_duration: *recover_duration, projectile_body: *projectile_body, projectile_light: *projectile_light, + projectile_gravity: *projectile_gravity, + initial_projectile_speed: *initial_projectile_speed, + max_projectile_speed: *max_projectile_speed, }), } } diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs index 2b6338a2f2..667571bda2 100644 --- a/common/src/comp/inventory/item/tool.rs +++ b/common/src/comp/inventory/item/tool.rs @@ -187,6 +187,7 @@ impl Tool { projectile_body: Body::Object(object::Body::Arrow), projectile_light: None, projectile_gravity: Some(Gravity(0.2)), + projectile_speed: 100.0, }, ChargedRanged { energy_cost: 0, @@ -200,6 +201,9 @@ impl Tool { recover_duration: Duration::from_millis(500), projectile_body: Body::Object(object::Body::MultiArrow), projectile_light: None, + projectile_gravity: Some(Gravity(0.2)), + initial_projectile_speed: 100.0, + max_projectile_speed: 500.0, }, ], Dagger(_) => vec![ @@ -296,6 +300,7 @@ impl Tool { }), projectile_gravity: None, + projectile_speed: 100.0, }, BasicRanged { energy_cost: 400, @@ -326,6 +331,7 @@ impl Tool { }), projectile_gravity: None, + projectile_speed: 100.0, }, ] } @@ -397,6 +403,7 @@ impl Tool { ..Default::default() }), projectile_gravity: None, + projectile_speed: 100.0, }, ] } else { diff --git a/common/src/event.rs b/common/src/event.rs index 7098522e93..bea3abf131 100644 --- a/common/src/event.rs +++ b/common/src/event.rs @@ -46,6 +46,7 @@ pub enum ServerEvent { light: Option, projectile: comp::Projectile, gravity: Option, + speed: f32, }, LandOnGround { entity: EcsEntity, diff --git a/common/src/states/basic_ranged.rs b/common/src/states/basic_ranged.rs index dd7f0ff820..4b0c928c64 100644 --- a/common/src/states/basic_ranged.rs +++ b/common/src/states/basic_ranged.rs @@ -21,6 +21,7 @@ pub struct Data { pub projectile_body: Body, pub projectile_light: Option, pub projectile_gravity: Option, + pub projectile_speed: f32, /// Whether the attack fired already pub exhausted: bool, } @@ -49,6 +50,7 @@ impl CharacterBehavior for Data { projectile_body: self.projectile_body, projectile_light: self.projectile_light, projectile_gravity: self.projectile_gravity, + projectile_speed: self.projectile_speed, exhausted: false, }); } else if !self.exhausted { @@ -62,6 +64,7 @@ impl CharacterBehavior for Data { projectile, light: self.projectile_light, gravity: self.projectile_gravity, + speed: self.projectile_speed, }); update.character = CharacterState::BasicRanged(Data { @@ -73,6 +76,7 @@ impl CharacterBehavior for Data { projectile_body: self.projectile_body, projectile_light: self.projectile_light, projectile_gravity: self.projectile_gravity, + projectile_speed: self.projectile_speed, exhausted: true, }); } else if self.recover_duration != Duration::default() { @@ -89,6 +93,7 @@ impl CharacterBehavior for Data { projectile_body: self.projectile_body, projectile_light: self.projectile_light, projectile_gravity: self.projectile_gravity, + projectile_speed: self.projectile_speed, exhausted: true, }); return update; diff --git a/common/src/states/charged_ranged.rs b/common/src/states/charged_ranged.rs index 1d9d1e8f72..c16f594711 100644 --- a/common/src/states/charged_ranged.rs +++ b/common/src/states/charged_ranged.rs @@ -10,9 +10,6 @@ use crate::{ use serde::{Deserialize, Serialize}; use std::time::Duration; -const MAX_GRAVITY: f32 = 0.2; -const MIN_GRAVITY: f32 = 0.05; - #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Data { /// Whether the attack fired already @@ -38,6 +35,9 @@ pub struct Data { /// Projectile information pub projectile_body: Body, pub projectile_light: Option, + pub projectile_gravity: Option, + pub initial_projectile_speed: f32, + pub max_projectile_speed: f32, } impl CharacterBehavior for Data { @@ -65,6 +65,9 @@ impl CharacterBehavior for Data { recover_duration: self.recover_duration, projectile_body: self.projectile_body, projectile_light: self.projectile_light, + projectile_gravity: self.projectile_gravity, + initial_projectile_speed: self.initial_projectile_speed, + max_projectile_speed: self.max_projectile_speed, }); } else if data.inputs.secondary.is_pressed() && self.charge_timer < self.charge_duration @@ -87,6 +90,9 @@ impl CharacterBehavior for Data { recover_duration: self.recover_duration, projectile_body: self.projectile_body, projectile_light: self.projectile_light, + projectile_gravity: self.projectile_gravity, + initial_projectile_speed: self.initial_projectile_speed, + max_projectile_speed: self.max_projectile_speed, }); // Consumes energy if there's enough left and RMB is held down @@ -109,6 +115,9 @@ impl CharacterBehavior for Data { recover_duration: self.recover_duration, projectile_body: self.projectile_body, projectile_light: self.projectile_light, + projectile_gravity: self.projectile_gravity, + initial_projectile_speed: self.initial_projectile_speed, + max_projectile_speed: self.max_projectile_speed, }); // Consumes energy if there's enough left and RMB is held down @@ -145,9 +154,8 @@ impl CharacterBehavior for Data { body: self.projectile_body, projectile, light: self.projectile_light, - gravity: Some(Gravity( - MAX_GRAVITY - charge_amount * (MAX_GRAVITY - MIN_GRAVITY), - )), + gravity: self.projectile_gravity, + speed: self.initial_projectile_speed + charge_amount * (self.max_projectile_speed - self.initial_projectile_speed), }); update.character = CharacterState::ChargedRanged(Data { @@ -163,6 +171,9 @@ impl CharacterBehavior for Data { recover_duration: self.recover_duration, projectile_body: self.projectile_body, projectile_light: self.projectile_light, + projectile_gravity: self.projectile_gravity, + initial_projectile_speed: self.initial_projectile_speed, + max_projectile_speed: self.max_projectile_speed, }); } else if self.recover_duration != Duration::default() { // Recovery @@ -182,6 +193,9 @@ impl CharacterBehavior for Data { .unwrap_or_default(), projectile_body: self.projectile_body, projectile_light: self.projectile_light, + projectile_gravity: self.projectile_gravity, + initial_projectile_speed: self.initial_projectile_speed, + max_projectile_speed: self.max_projectile_speed, }); } else { // Done diff --git a/server/src/events/entity_creation.rs b/server/src/events/entity_creation.rs index 28034143a8..d9a2263557 100644 --- a/server/src/events/entity_creation.rs +++ b/server/src/events/entity_creation.rs @@ -87,6 +87,7 @@ pub fn handle_shoot( light: Option, projectile: Projectile, gravity: Option, + speed: f32, ) { let state = server.state_mut(); @@ -97,7 +98,7 @@ pub fn handle_shoot( .expect("Failed to fetch entity") .0; - let vel = *dir * 100.0; + let vel = *dir * speed; // Add an outcome state diff --git a/server/src/events/mod.rs b/server/src/events/mod.rs index d56c4fa8c4..31b3dc631a 100644 --- a/server/src/events/mod.rs +++ b/server/src/events/mod.rs @@ -68,7 +68,8 @@ impl Server { light, projectile, gravity, - } => handle_shoot(self, entity, dir, body, light, projectile, gravity), + speed, + } => handle_shoot(self, entity, dir, body, light, projectile, gravity, speed), ServerEvent::Damage { uid, change } => handle_damage(&self, uid, change), ServerEvent::Destroy { entity, cause } => handle_destroy(self, entity, cause), ServerEvent::InventoryManip(entity, manip) => handle_inventory(self, entity, manip),