mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Projectile speed is no longer hard-coded.
This commit is contained in:
parent
66b0fee3c7
commit
68ecfba291
@ -63,6 +63,7 @@ pub enum CharacterAbility {
|
||||
projectile_body: Body,
|
||||
projectile_light: Option<LightEmitter>,
|
||||
projectile_gravity: Option<Gravity>,
|
||||
projectile_speed: f32,
|
||||
},
|
||||
Boost {
|
||||
duration: Duration,
|
||||
@ -105,6 +106,9 @@ pub enum CharacterAbility {
|
||||
recover_duration: Duration,
|
||||
projectile_body: Body,
|
||||
projectile_light: Option<LightEmitter>,
|
||||
projectile_gravity: Option<Gravity>,
|
||||
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,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -46,6 +46,7 @@ pub enum ServerEvent {
|
||||
light: Option<comp::LightEmitter>,
|
||||
projectile: comp::Projectile,
|
||||
gravity: Option<comp::Gravity>,
|
||||
speed: f32,
|
||||
},
|
||||
LandOnGround {
|
||||
entity: EcsEntity,
|
||||
|
@ -21,6 +21,7 @@ pub struct Data {
|
||||
pub projectile_body: Body,
|
||||
pub projectile_light: Option<LightEmitter>,
|
||||
pub projectile_gravity: Option<Gravity>,
|
||||
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;
|
||||
|
@ -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<LightEmitter>,
|
||||
pub projectile_gravity: Option<Gravity>,
|
||||
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
|
||||
|
@ -87,6 +87,7 @@ pub fn handle_shoot(
|
||||
light: Option<LightEmitter>,
|
||||
projectile: Projectile,
|
||||
gravity: Option<Gravity>,
|
||||
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
|
||||
|
@ -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),
|
||||
|
Loading…
Reference in New Issue
Block a user