Fireballs no longer damage group members

This commit is contained in:
Imbris 2020-08-07 00:33:24 -04:00 committed by Monty Marz
parent af8560ea36
commit a7df000a6f
7 changed files with 35 additions and 9 deletions

View File

@ -1050,7 +1050,7 @@ impl Client {
self.group_leader = Some(leader);
self.group_members = members.into_iter().collect();
// Currently add/remove messages treat client as an implicit member
// of the group whereas this message explicitly included them so to
// of the group whereas this message explicitly includes them so to
// be consistent for now we will remove the client from the
// received hashset
if let Some(uid) = self.uid() {

View File

@ -25,6 +25,7 @@ pub enum ServerEvent {
pos: Vec3<f32>,
power: f32,
owner: Option<Uid>,
friendly_damage: bool,
},
Damage {
uid: Uid,

View File

@ -70,6 +70,7 @@ impl<'a> System<'a> for Sys {
pos: pos.0,
power,
owner: projectile.owner,
friendly_damage: false,
})
},
projectile::Effect::Vanish => server_emitter.emit(ServerEvent::Destroy {
@ -131,6 +132,7 @@ impl<'a> System<'a> for Sys {
pos: pos.0,
power,
owner: projectile.owner,
friendly_damage: false,
})
},
projectile::Effect::Vanish => server_emitter.emit(ServerEvent::Destroy {

View File

@ -1006,6 +1006,7 @@ fn handle_explosion(
pos: pos.0,
power,
owner: ecs.read_storage::<Uid>().get(target).copied(),
friendly_damage: true,
})
},
None => server.notify_client(

View File

@ -7,12 +7,12 @@ use common::{
},
msg::{PlayerListUpdate, ServerMsg},
state::BlockChange,
sync::{Uid, WorldSyncExt},
sync::{Uid, UidAllocator, WorldSyncExt},
sys::combat::BLOCK_ANGLE,
terrain::{Block, TerrainGrid},
vol::{ReadVol, Vox},
};
use specs::{join::Join, Entity as EcsEntity, WorldExt};
use specs::{join::Join, saveload::MarkerAllocator, Entity as EcsEntity, WorldExt};
use tracing::error;
use vek::Vec3;
@ -277,11 +277,25 @@ pub fn handle_respawn(server: &Server, entity: EcsEntity) {
}
}
pub fn handle_explosion(server: &Server, pos: Vec3<f32>, power: f32, owner: Option<Uid>) {
pub fn handle_explosion(
server: &Server,
pos: Vec3<f32>,
power: f32,
owner: Option<Uid>,
friendly_damage: bool,
) {
// Go through all other entities
let hit_range = 3.0 * power;
let ecs = &server.state.ecs();
for (pos_b, ori_b, character_b, stats_b, loadout_b) in (
let owner_entity = owner.and_then(|uid| {
ecs.read_resource::<UidAllocator>()
.retrieve_entity_internal(uid.into())
});
let groups = ecs.read_storage::<comp::Group>();
for (entity_b, pos_b, ori_b, character_b, stats_b, loadout_b) in (
&ecs.entities(),
&ecs.read_storage::<comp::Pos>(),
&ecs.read_storage::<comp::Ori>(),
ecs.read_storage::<comp::CharacterState>().maybe(),
@ -293,9 +307,13 @@ pub fn handle_explosion(server: &Server, pos: Vec3<f32>, power: f32, owner: Opti
let distance_squared = pos.distance_squared(pos_b.0);
// Check if it is a hit
if !stats_b.is_dead
// Spherical wedge shaped attack field
// RADIUS
&& distance_squared < hit_range.powi(2)
// Skip if they are in the same group and friendly_damage is turned off for the
// explosion
&& (friendly_damage || !owner_entity
.and_then(|e| groups.get(e))
.map_or(false, |group_a| Some(group_a) == groups.get(entity_b)))
{
// Weapon gives base damage
let dmg = (1.0 - distance_squared / hit_range.powi(2)) * power * 130.0;

View File

@ -50,9 +50,12 @@ impl Server {
for event in events {
match event {
ServerEvent::Explosion { pos, power, owner } => {
handle_explosion(&self, pos, power, owner)
},
ServerEvent::Explosion {
pos,
power,
owner,
friendly_damage,
} => handle_explosion(&self, pos, power, owner, friendly_damage),
ServerEvent::Shoot {
entity,
dir,

View File

@ -39,6 +39,7 @@ impl<'a> System<'a> for Sys {
pos: pos.0,
power: 4.0,
owner: *owner,
friendly_damage: true,
});
}
},