From 04dcd012da3b07ec66daa010e2134c1f02a86980 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 4 Oct 2020 15:44:28 -0500 Subject: [PATCH] Flamethrower particles. --- assets/voxygen/shaders/particle-vert.glsl | 8 ++--- common/src/comp/inventory/item/tool.rs | 36 +++++++++++------------ voxygen/src/scene/particle.rs | 34 +++++++-------------- 3 files changed, 33 insertions(+), 45 deletions(-) diff --git a/assets/voxygen/shaders/particle-vert.glsl b/assets/voxygen/shaders/particle-vert.glsl index 04ecb6b32c..1db07d3151 100644 --- a/assets/voxygen/shaders/particle-vert.glsl +++ b/assets/voxygen/shaders/particle-vert.glsl @@ -289,10 +289,10 @@ void main() { ); } else if (inst_mode == FLAMETHROWER) { attr = Attr( - inst_dir * lifetime / inst_lifespan, - vec3(1), - vec4(1, 0.3 + rand5 * 0.4, 0, 0.4), - spin_in_axis(vec3(rand6, rand7, rand8), rand9 * 3) + (inst_dir * lifetime / inst_lifespan) + vec3(rand0, rand1, rand2) * 0.3, + vec3(0.6 + rand3 * 0.5 + lifetime / inst_lifespan * 5), + vec4(1, 0.6 + rand5 * 0.3 - 0.6 * lifetime / inst_lifespan, 0, 0.8 - 0.6 * lifetime / inst_lifespan), + spin_in_axis(vec3(rand6, rand7, rand8), lifetime / inst_lifespan * 10 + 3 * rand9) ); } else { attr = Attr( diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs index 156a178e93..20cddd8c39 100644 --- a/common/src/comp/inventory/item/tool.rs +++ b/common/src/comp/inventory/item/tool.rs @@ -367,11 +367,11 @@ impl Tool { recover_duration: Duration::from_millis(250), beam_duration: Duration::from_secs(1), base_hps: (60.0 * self.base_power()) as u32, - base_dps: (40.0 * self.base_power()) as u32, + base_dps: (60.0 * self.base_power()) as u32, tick_rate: 2.0, range: 25.0, max_angle: 1.0, - lifesteal_eff: 0.25, + lifesteal_eff: 0.20, energy_regen: 50, energy_drain: 100, }, @@ -409,22 +409,8 @@ impl Tool { }, ], Staff(_) => vec![ - BasicBeam { - energy_cost: 0, - buildup_duration: Duration::from_millis(250), - recover_duration: Duration::from_millis(250), - beam_duration: Duration::from_millis(500), - base_hps: 0, - base_dps: (100.0 * self.base_power()) as u32, - tick_rate: 2.0, - range: 15.0, - max_angle: 22.5, - lifesteal_eff: 0.0, - energy_regen: 50, - energy_drain: 0, - }, BasicRanged { - energy_cost: 400, + energy_cost: 0, holdable: true, prepare_duration: Duration::from_millis(800), recover_duration: Duration::from_millis(50), @@ -455,8 +441,22 @@ impl Tool { projectile_gravity: Some(Gravity(0.5)), projectile_speed: 40.0, }, + BasicBeam { + energy_cost: 0, + buildup_duration: Duration::from_millis(250), + recover_duration: Duration::from_millis(250), + beam_duration: Duration::from_millis(500), + base_hps: 0, + base_dps: (100.0 * self.base_power()) as u32, + tick_rate: 2.0, + range: 15.0, + max_angle: 22.5, + lifesteal_eff: 0.0, + energy_regen: 50, + energy_drain: 0, + }, Shockwave { - energy_cost: 750, + energy_cost: 0, buildup_duration: Duration::from_millis(500), recover_duration: Duration::from_millis(300), damage: 200, diff --git a/voxygen/src/scene/particle.rs b/voxygen/src/scene/particle.rs index 307f638251..0b171f94b1 100644 --- a/voxygen/src/scene/particle.rs +++ b/voxygen/src/scene/particle.rs @@ -22,7 +22,7 @@ use dot_vox::DotVoxData; use hashbrown::HashMap; use rand::prelude::*; use specs::{Join, WorldExt}; -use std::time::Duration; +use std::{f32::consts::PI, time::Duration}; use vek::*; pub struct ParticleMgr { @@ -368,27 +368,15 @@ impl ParticleMgr { } } else { let mut rng = thread_rng(); - let (phi, theta) = (particle_ori.z.acos(), particle_ori.y.atan2(particle_ori.x)); - for _ in 0..self.scheduler.heartbeats(Duration::from_millis(1)) { - let phi2 = phi + rng.gen_range(-b.static_data.max_angle.to_radians(), b.static_data.max_angle.to_radians()); - let theta2 = theta + rng.gen_range(-b.static_data.max_angle.to_radians(), b.static_data.max_angle.to_radians()); - let random_ori = Vec3::new(phi2.sin()*theta2.cos(), phi2.sin()*theta2.sin(), phi2.cos()).try_normalized().unwrap_or(particle_ori); - self.particles.push(Particle::new_beam( - b.static_data.beam_duration, - time, - ParticleMode::FlameThrower, - pos.0 + random_ori * 0.5 + Vec3::new(0.0, 0.0, b.offset), - pos.0 - + random_ori * b.static_data.range - + Vec3::new(0.0, 0.0, b.offset), - )); - } - /*self.particles.resize_with( - self.particles.len() + 10 * usize::from(self.scheduler.heartbeats(Duration::from_millis(1))), + let (from, to) = (Vec3::::unit_z(), particle_ori); + let m = Mat3::::rotation_from_to_3d(from, to); + self.particles.resize_with( + self.particles.len() + 2 * usize::from(self.scheduler.heartbeats(Duration::from_millis(1))), || { - let phi2 = phi + rng.gen_range(-b.static_data.max_angle.to_radians(), b.static_data.max_angle.to_radians()); - let theta2 = theta + rng.gen_range(-b.static_data.max_angle.to_radians(), b.static_data.max_angle.to_radians()); - let random_ori = Vec3::new(phi2.sin()*theta2.cos(), phi2.sin()*theta2.sin(), phi2.cos()).try_normalized().unwrap_or(particle_ori); + let phi: f32 = rng.gen_range(0.0, b.static_data.max_angle.to_radians()); + let theta: f32 = rng.gen_range(0.0, 2.0 * PI); + let offset_z = Vec3::new(phi.sin() * theta.cos(), phi.sin() * theta.sin(), phi.cos()); + let random_ori = offset_z * m * Vec3::new(-1.0, -1.0, 1.0); Particle::new_beam( b.static_data.beam_duration, time, @@ -399,7 +387,7 @@ impl ParticleMgr { + Vec3::new(0.0, 0.0, b.offset), ) }, - );*/ + ); } } } @@ -769,4 +757,4 @@ impl Particle { instance: ParticleInstance::new_beam(time, lifespan.as_secs_f32(), mode, pos1, pos2), } } -} +} \ No newline at end of file