mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Rtsim death event
This commit is contained in:
parent
c4032ee024
commit
94390331e0
@ -1,4 +1,4 @@
|
|||||||
use super::{RtState, Rule};
|
use crate::{data::NpcId, RtState, Rule};
|
||||||
use common::resources::{Time, TimeOfDay};
|
use common::resources::{Time, TimeOfDay};
|
||||||
use world::{IndexRef, World};
|
use world::{IndexRef, World};
|
||||||
|
|
||||||
@ -23,3 +23,9 @@ pub struct OnTick {
|
|||||||
pub dt: f32,
|
pub dt: f32,
|
||||||
}
|
}
|
||||||
impl Event for OnTick {}
|
impl Event for OnTick {}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct OnDeath {
|
||||||
|
pub npc_id: NpcId,
|
||||||
|
}
|
||||||
|
impl Event for OnDeath {}
|
||||||
|
@ -77,10 +77,11 @@ impl Data {
|
|||||||
// matches!(&index.sites.get(ws).kind, SiteKind::Refactor(_)))) .skip(1)
|
// matches!(&index.sites.get(ws).kind, SiteKind::Refactor(_)))) .skip(1)
|
||||||
// .take(1)
|
// .take(1)
|
||||||
{
|
{
|
||||||
let good_or_evil = site
|
let Some(good_or_evil) = site
|
||||||
.faction
|
.faction
|
||||||
.and_then(|f| this.factions.get(f))
|
.and_then(|f| this.factions.get(f))
|
||||||
.map_or(true, |f| f.good_or_evil);
|
.map(|f| f.good_or_evil)
|
||||||
|
else { continue };
|
||||||
|
|
||||||
let rand_wpos = |rng: &mut SmallRng| {
|
let rand_wpos = |rng: &mut SmallRng| {
|
||||||
let wpos2d = site.wpos.map(|e| e + rng.gen_range(-10..10));
|
let wpos2d = site.wpos.map(|e| e + rng.gen_range(-10..10));
|
||||||
@ -89,7 +90,7 @@ impl Data {
|
|||||||
.with_z(world.sim().get_alt_approx(wpos2d).unwrap_or(0.0))
|
.with_z(world.sim().get_alt_approx(wpos2d).unwrap_or(0.0))
|
||||||
};
|
};
|
||||||
if good_or_evil {
|
if good_or_evil {
|
||||||
for _ in 0..250 {
|
for _ in 0..64 {
|
||||||
this.npcs.create(
|
this.npcs.create(
|
||||||
Npc::new(rng.gen(), rand_wpos(&mut rng))
|
Npc::new(rng.gen(), rand_wpos(&mut rng))
|
||||||
.with_faction(site.faction)
|
.with_faction(site.faction)
|
||||||
|
@ -43,7 +43,7 @@ use rand_distr::Distribution;
|
|||||||
use specs::{
|
use specs::{
|
||||||
join::Join, saveload::MarkerAllocator, Builder, Entity as EcsEntity, Entity, WorldExt,
|
join::Join, saveload::MarkerAllocator, Builder, Entity as EcsEntity, Entity, WorldExt,
|
||||||
};
|
};
|
||||||
use std::{collections::HashMap, iter, time::Duration};
|
use std::{collections::HashMap, iter, sync::Arc, time::Duration};
|
||||||
use tracing::{debug, error};
|
use tracing::{debug, error};
|
||||||
use vek::{Vec2, Vec3};
|
use vek::{Vec2, Vec3};
|
||||||
|
|
||||||
@ -528,7 +528,14 @@ pub fn handle_destroy(server: &mut Server, entity: EcsEntity, last_change: Healt
|
|||||||
state
|
state
|
||||||
.ecs()
|
.ecs()
|
||||||
.write_resource::<rtsim2::RtSim>()
|
.write_resource::<rtsim2::RtSim>()
|
||||||
.hook_rtsim_entity_delete(rtsim_entity);
|
.hook_rtsim_entity_delete(
|
||||||
|
&state.ecs().read_resource::<Arc<world::World>>(),
|
||||||
|
state
|
||||||
|
.ecs()
|
||||||
|
.read_resource::<world::IndexOwned>()
|
||||||
|
.as_index_ref(),
|
||||||
|
rtsim_entity,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Err(e) = state.delete_entity_recorded(entity) {
|
if let Err(e) = state.delete_entity_recorded(entity) {
|
||||||
|
@ -13,7 +13,7 @@ use common_ecs::{dispatch, System};
|
|||||||
use enum_map::EnumMap;
|
use enum_map::EnumMap;
|
||||||
use rtsim2::{
|
use rtsim2::{
|
||||||
data::{npc::NpcMode, Data, ReadError},
|
data::{npc::NpcMode, Data, ReadError},
|
||||||
event::OnSetup,
|
event::{OnDeath, OnSetup},
|
||||||
rule::Rule,
|
rule::Rule,
|
||||||
RtState,
|
RtState,
|
||||||
};
|
};
|
||||||
@ -154,8 +154,14 @@ impl RtSim {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn hook_rtsim_entity_delete(&mut self, entity: RtSimEntity) {
|
pub fn hook_rtsim_entity_delete(
|
||||||
// TODO: Emit event on deletion to catch death?
|
&mut self,
|
||||||
|
world: &World,
|
||||||
|
index: IndexRef,
|
||||||
|
entity: RtSimEntity,
|
||||||
|
) {
|
||||||
|
// Should entity deletion be death? They're not exactly the same thing...
|
||||||
|
self.state.emit(OnDeath { npc_id: entity.0 }, world, index);
|
||||||
self.state.data_mut().npcs.remove(entity.0);
|
self.state.data_mut().npcs.remove(entity.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user