Skip to content

Commit 7590248

Browse files
authored
check if entity exists before accessing (#68)
* check if entity exists before accessing components. Check if entities exist before trying to add components to them * cache entities on check to not access twice * Covered a few more cases. * applied rustfmt changes
1 parent 4133152 commit 7590248

File tree

2 files changed

+36
-12
lines changed

2 files changed

+36
-12
lines changed

bevy_script_api/src/common/bevy/mod.rs

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,10 @@ impl ScriptWorld {
169169
) -> Result<ScriptRef, ScriptError> {
170170
let mut w = self.write();
171171

172+
let mut entity_ref = w
173+
.get_entity_mut(entity)
174+
.ok_or_else(|| ScriptError::Other(format!("Entity is not valid {:#?}", entity)))?;
175+
172176
let component_data = comp_type.data::<ReflectComponent>().ok_or_else(|| {
173177
ScriptError::Other(format!("Not a component {}", comp_type.short_name()))
174178
})?;
@@ -177,18 +181,18 @@ impl ScriptWorld {
177181
// TODO: maybe get an add_default impl added to ReflectComponent
178182
// this means that we don't require ReflectDefault for adding components!
179183
match comp_type.0.type_info(){
180-
bevy::reflect::TypeInfo::Struct(_) => component_data.insert(&mut w.entity_mut(entity), &DynamicStruct::default()),
181-
bevy::reflect::TypeInfo::TupleStruct(_) => component_data.insert(&mut w.entity_mut(entity), &DynamicTupleStruct::default()),
182-
bevy::reflect::TypeInfo::Tuple(_) => component_data.insert(&mut w.entity_mut(entity), &DynamicTuple::default()),
183-
bevy::reflect::TypeInfo::List(_) => component_data.insert(&mut w.entity_mut(entity), &DynamicList::default()),
184-
bevy::reflect::TypeInfo::Array(_) => component_data.insert(&mut w.entity_mut(entity), &DynamicArray::new(Box::new([]))),
185-
bevy::reflect::TypeInfo::Map(_) => component_data.insert(&mut w.entity_mut(entity), &DynamicMap::default()),
186-
bevy::reflect::TypeInfo::Value(_) => component_data.insert(&mut w.entity_mut(entity),
184+
bevy::reflect::TypeInfo::Struct(_) => component_data.insert(&mut entity_ref, &DynamicStruct::default()),
185+
bevy::reflect::TypeInfo::TupleStruct(_) => component_data.insert(&mut entity_ref, &DynamicTupleStruct::default()),
186+
bevy::reflect::TypeInfo::Tuple(_) => component_data.insert(&mut entity_ref, &DynamicTuple::default()),
187+
bevy::reflect::TypeInfo::List(_) => component_data.insert(&mut entity_ref, &DynamicList::default()),
188+
bevy::reflect::TypeInfo::Array(_) => component_data.insert(&mut entity_ref, &DynamicArray::new(Box::new([]))),
189+
bevy::reflect::TypeInfo::Map(_) => component_data.insert(&mut entity_ref, &DynamicMap::default()),
190+
bevy::reflect::TypeInfo::Value(_) => component_data.insert(&mut entity_ref,
187191
comp_type.data::<ReflectDefault>().ok_or_else(||
188192
ScriptError::Other(format!("Component {} is a value or dynamic type with no `ReflectDefault` type_data, cannot instantiate sensible value",comp_type.short_name())))?
189193
.default()
190194
.as_ref()),
191-
bevy::reflect::TypeInfo::Enum(_) => component_data.insert(&mut w.entity_mut(entity), &DynamicEnum::default())
195+
bevy::reflect::TypeInfo::Enum(_) => component_data.insert(&mut entity_ref, &DynamicEnum::default())
192196
};
193197

194198
Ok(ScriptRef::new_component_ref(
@@ -205,11 +209,15 @@ impl ScriptWorld {
205209
) -> Result<Option<ScriptRef>, ScriptError> {
206210
let w = self.read();
207211

212+
let entity_ref = w
213+
.get_entity(entity)
214+
.ok_or_else(|| ScriptError::Other(format!("Entity is not valid {:#?}", entity)))?;
215+
208216
let component_data = comp_type.data::<ReflectComponent>().ok_or_else(|| {
209217
ScriptError::Other(format!("Not a component {}", comp_type.short_name()))
210218
})?;
211219

212-
Ok(component_data.reflect(w.entity(entity)).map(|_component| {
220+
Ok(component_data.reflect(entity_ref).map(|_component| {
213221
ScriptRef::new_component_ref(component_data.clone(), entity, self.clone().into())
214222
}))
215223
}
@@ -224,7 +232,11 @@ impl ScriptWorld {
224232
ScriptError::Other(format!("Not a component {}", comp_type.short_name()))
225233
})?;
226234

227-
Ok(component_data.reflect(w.entity(entity)).is_some())
235+
let entity_ref = w
236+
.get_entity(entity)
237+
.ok_or_else(|| ScriptError::Other(format!("Entity is not valid {:#?}", entity)))?;
238+
239+
Ok(component_data.reflect(entity_ref).is_some())
228240
}
229241

230242
pub fn remove_component(
@@ -233,10 +245,15 @@ impl ScriptWorld {
233245
comp_type: ScriptTypeRegistration,
234246
) -> Result<(), ScriptError> {
235247
let mut w = self.write();
248+
249+
let mut entity_ref = w
250+
.get_entity_mut(entity)
251+
.ok_or_else(|| ScriptError::Other(format!("Entity is not valid {:#?}", entity)))?;
252+
236253
let component_data = comp_type.data::<ReflectComponent>().ok_or_else(|| {
237254
ScriptError::Other(format!("Not a component {}", comp_type.short_name()))
238255
})?;
239-
component_data.remove(&mut w.entity_mut(entity));
256+
component_data.remove(&mut entity_ref);
240257
Ok(())
241258
}
242259

bevy_script_api/src/sub_reflect.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,14 @@ impl ReflectPath {
348348
ReflectBase::Component { comp, entity } => {
349349
let g = world_ptr.read();
350350

351-
let ref_ = self.walk_path(comp.reflect(g.entity(*entity)).ok_or_else(|| {
351+
let entity_ref =
352+
g.get_entity(*entity)
353+
.ok_or_else(|| ReflectionError::InvalidBaseReference {
354+
base: self.base.to_string(),
355+
reason: "This entity does not exist".to_owned(),
356+
})?;
357+
358+
let ref_ = self.walk_path(comp.reflect(entity_ref).ok_or_else(|| {
352359
ReflectionError::InvalidBaseReference {
353360
base: self.base.to_string(),
354361
reason: "Given component does not exist on this entity".to_owned(),

0 commit comments

Comments
 (0)