diff --git a/common/src/comp/inventory/item.rs b/common/src/comp/inventory/item.rs index 6f522eb094..6392756d71 100644 --- a/common/src/comp/inventory/item.rs +++ b/common/src/comp/inventory/item.rs @@ -114,11 +114,31 @@ impl ToolData { recover_duration: Duration::from_millis(400), base_damage: 5, }], - Staff(_) => vec![BasicMelee { - buildup_duration: Duration::from_millis(400), - recover_duration: Duration::from_millis(300), - base_damage: 7, - }], + Staff(_) => vec![ + BasicMelee { + buildup_duration: Duration::from_millis(400), + recover_duration: Duration::from_millis(300), + base_damage: 7, + }, + BasicRanged { + projectile: Projectile { + hit_ground: vec![projectile::Effect::Vanish], + hit_wall: vec![projectile::Effect::Vanish], + hit_entity: vec![ + projectile::Effect::Damage(HealthChange { + // TODO: This should not be fixed (?) + amount: -8, + cause: HealthSource::Item, + }), + projectile::Effect::Vanish, + ], + time_left: Duration::from_secs(5), + owner: None, + }, + projectile_body: Body::Object(object::Body::BoltFire), + recover_duration: Duration::from_millis(800), + }, + ], Shield(_) => vec![BasicBlock], Debug(kind) => match kind { DebugKind::Boost => vec![ diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index 29c9c606e5..1de8f83dd7 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -91,29 +91,35 @@ pub fn handle_destroy(server: &mut Server, entity: EcsEntity, cause: HealthSourc .write_storage::() .insert(entity, comp::CharacterState::default()); } else { - // Replace npc with loot - let _ = state - .ecs() - .write_storage() - .insert(entity, Body::Object(object::Body::Pouch)); - let _ = state.ecs().write_storage().insert( - entity, - assets::load_expect_cloned::("common.items.cheese"), - ); - state.ecs().write_storage::().remove(entity); - state.ecs().write_storage::().remove(entity); - state - .ecs() - .write_storage::() - .remove(entity); - state - .ecs() - .write_storage::() - .remove(entity); - state - .ecs() - .write_storage::() - .remove(entity); + if state.ecs().read_storage::().contains(entity) { + // Replace npc with loot + let _ = state + .ecs() + .write_storage() + .insert(entity, Body::Object(object::Body::Pouch)); + let _ = state.ecs().write_storage().insert( + entity, + assets::load_expect_cloned::("common.items.cheese"), + ); + state.ecs().write_storage::().remove(entity); + state.ecs().write_storage::().remove(entity); + state + .ecs() + .write_storage::() + .remove(entity); + state + .ecs() + .write_storage::() + .remove(entity); + state + .ecs() + .write_storage::() + .remove(entity); + } else { + if let Err(err) = state.delete_entity_recorded(entity) { + error!("Failed to delete destroyed entity: {:?}", err); + } + } // TODO: Add Delete(time_left: Duration) component /*