From 9d47fd8c3ea440d849f22b616752dcec9f8be37e Mon Sep 17 00:00:00 2001 From: timokoesters Date: Mon, 23 Mar 2020 18:13:14 +0100 Subject: [PATCH] Better explosions --- server/src/events/entity_manipulation.rs | 40 ++++++++++++++++++++---- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index ab61740264..4d17cc6b5c 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -10,7 +10,7 @@ use common::{ }; use log::error; use specs::{join::Join, Entity as EcsEntity, WorldExt}; -use vek::{Vec3, *}; +use vek::Vec3; const BLOCK_EFFICIENCY: f32 = 0.9; const BLOCK_ANGLE: f32 = 180.0; @@ -196,9 +196,7 @@ pub fn handle_explosion(server: &Server, pos: Vec3, power: f32, owner: Opti // Go through all other entities let hit_range = 2.0 * power; let ecs = &server.state.ecs(); - for (b, uid_b, pos_b, ori_b, character_b, stats_b) in ( - &ecs.entities(), - &ecs.read_storage::(), + for (pos_b, ori_b, character_b, stats_b) in ( &ecs.read_storage::(), &ecs.read_storage::(), &ecs.read_storage::(), @@ -214,7 +212,7 @@ pub fn handle_explosion(server: &Server, pos: Vec3, power: f32, owner: Opti && distance_squared < hit_range.powi(2) { // Weapon gives base damage - let mut dmg = ((1.0 - distance_squared / hit_range.powi(2)) * power * 5.0) as u32; + let mut dmg = ((1.0 - distance_squared / hit_range.powi(2)) * power * 10.0) as u32; if rand::random() { dmg += 1; @@ -236,6 +234,8 @@ pub fn handle_explosion(server: &Server, pos: Vec3, power: f32, owner: Opti const RAYS: usize = 500; + // Color terrain + let mut touched_blocks = Vec::new(); for _ in 0..RAYS { let dir = Vec3::new( rand::random::() - 0.5, @@ -244,7 +244,35 @@ pub fn handle_explosion(server: &Server, pos: Vec3, power: f32, owner: Opti ) .normalized(); - let mut block_change = ecs.write_resource::(); + let _ = ecs + .read_resource::() + .ray(pos, pos + dir * power * 2.5) + .until(|_| rand::random::() < 0.05) + .for_each(|pos| touched_blocks.push(pos)) + .cast(); + } + + let terrain = ecs.read_resource::(); + let mut block_change = ecs.write_resource::(); + for pos in touched_blocks { + if let Ok(block) = terrain.get(pos) { + if let Some(mut color) = block.get_color() { + color[0] /= 2; + color[1] /= 3; + color[2] /= 3; + block_change.set(pos, Block::new(block.kind(), color)); + } + } + } + + // Destroy terrain + for _ in 0..RAYS { + let dir = Vec3::new( + rand::random::() - 0.5, + rand::random::() - 0.5, + rand::random::() - 0.5, + ) + .normalized(); let _ = ecs .read_resource::()