pub struct BrdbSchemaGlobalData {
pub entity_type_names: IndexSet<String>,
pub entity_data_class_names: IndexSet<String>,
pub basic_brick_asset_names: IndexSet<String>,
pub procedural_brick_asset_names: IndexSet<String>,
pub material_asset_names: IndexSet<String>,
pub component_type_names: IndexSet<String>,
pub component_data_struct_names: Vec<String>,
pub component_wire_port_names: IndexSet<String>,
pub external_asset_types: HashSet<String>,
pub external_asset_references: IndexSet<(String, String)>,
pub global_grid_entity_type_index: i32,
}Fields§
§entity_type_names: IndexSet<String>§entity_data_class_names: IndexSet<String>§basic_brick_asset_names: IndexSet<String>§procedural_brick_asset_names: IndexSet<String>§material_asset_names: IndexSet<String>§component_type_names: IndexSet<String>§component_data_struct_names: Vec<String>§component_wire_port_names: IndexSet<String>§external_asset_types: HashSet<String>Internal set for type checking, not used in the BRDB.
external_asset_references: IndexSet<(String, String)>§global_grid_entity_type_index: i32Index into entity_type_names for the BP_BrickGrid_Global_C entity type,
or -1 if the save has no global grid.
Implementations§
Source§impl BrdbSchemaGlobalData
impl BrdbSchemaGlobalData
pub fn add_brick_meta(&mut self, brick: &Brick)
pub fn get_struct_name(&self, type_name: &str) -> Option<&str>
pub fn get_entity_class_name(&self, type_name: &str) -> Option<&str>
pub fn get_port_index(&self, port_name: &str) -> Option<u16>
pub fn get_component_type_index(&self, type_name: &str) -> Option<u16>
pub fn has_component_type(&self, type_name: &str) -> bool
pub fn add_entity_type(&mut self, type_name: &str)
Sourcepub fn add_entity_type_with_class(&mut self, type_name: &str, class_name: &str)
pub fn add_entity_type_with_class(&mut self, type_name: &str, class_name: &str)
Register an entity type with its explicit data-class name. Keeps
entity_type_names and entity_data_class_names parallel as the
saved-world format requires.
pub fn basic_brick_asset_by_index( &self, index: usize, ) -> Result<BString, BrdbSchemaError>
pub fn procedural_brick_asset_by_index( &self, index: usize, ) -> Result<BString, BrdbSchemaError>
pub fn material_asset_by_index( &self, index: usize, ) -> Result<BString, BrdbSchemaError>
Sourcepub fn proc_brick_starting_index(&self) -> u32
pub fn proc_brick_starting_index(&self) -> u32
proc_brick_starting_index needs to exist because the type ids of brick assets are
stored in the GlobalData, and the type ids of procedural
bricks are assigned starting from the end of the basic brick
asset names.
When new brick assets are added, the length of the basic brick asset names will increase, and the type ids of procedural bricks in older chunks will not match the new basic brick asset names.
This offset allows older chunks to properly load, assuming the global data does not change the order of brick asset names (by external tools)
Examples found in repository?
5fn main() -> Result<(), Box<dyn std::error::Error>> {
6 let path = PathBuf::from("world.brdb");
7 let dst = PathBuf::from("world_patched.brdb");
8
9 println!("Warning - This code will break if the brick chunk struct changes!!");
10
11 let db = Brdb::open(path)?.into_reader();
12
13 let data = db.global_data()?;
14 let mut grid = UnsavedGrid::default();
15
16 let mut total_bricks = 0;
17 for chunk in db.brick_chunk_index(1)? {
18 for brick in db
19 .brick_chunk_soa(1, chunk.index)?
20 .iter_bricks(chunk.index, data.clone())
21 {
22 // If we wanted wires/components, we'd need to track the bricks here by their chunk index and brick index
23 total_bricks += 1;
24
25 let mut brick = brick?;
26 brick.position += Position::new(3000, 0, 0);
27 grid.add_brick(data.as_ref(), &brick);
28 }
29
30 if chunk.num_components > 0 {
31 println!("sorry, this example doesn't handle components");
32 }
33 if chunk.num_wires > 0 {
34 println!("sorry, this example doesn't handle wires");
35 }
36 }
37 println!("{total_bricks} bricks");
38
39 let mut pending = db.to_pending()?;
40
41 // Replace the main grid (1) with the grid we created
42 *pending.cd_mut("World/0/Bricks/Grids/1")? = grid.to_pending(
43 data.proc_brick_starting_index(),
44 db.components_schema()?.as_ref(),
45 )?;
46
47 if dst.exists() {
48 std::fs::remove_file(&dst)?;
49 }
50 Brdb::new(&dst)?.write_pending("Move the bricks", pending)?;
51
52 // Verify bricks can be read
53 let db = Brdb::open(dst)?.into_reader();
54 for chunk in db.brick_chunk_index(1)? {
55 let _ = db.brick_chunk_soa(1, chunk.index)?;
56 }
57
58 Ok(())
59}Trait Implementations§
Source§impl AsBrdbValue for BrdbSchemaGlobalData
impl AsBrdbValue for BrdbSchemaGlobalData
Source§fn as_brdb_struct_prop_value(
&self,
schema: &BrdbSchema,
_struct_name: BrdbInterned,
prop_name: BrdbInterned,
) -> Result<&dyn AsBrdbValue, BrdbSchemaError>
fn as_brdb_struct_prop_value( &self, schema: &BrdbSchema, _struct_name: BrdbInterned, prop_name: BrdbInterned, ) -> Result<&dyn AsBrdbValue, BrdbSchemaError>
Source§fn as_brdb_struct_prop_array(
&self,
schema: &BrdbSchema,
_struct_name: BrdbInterned,
prop_name: BrdbInterned,
) -> Result<BrdbArrayIter<'_>, BrdbSchemaError>
fn as_brdb_struct_prop_array( &self, schema: &BrdbSchema, _struct_name: BrdbInterned, prop_name: BrdbInterned, ) -> Result<BrdbArrayIter<'_>, BrdbSchemaError>
fn as_brdb_bool(&self) -> Result<bool, BrdbSchemaError>
fn as_brdb_u8(&self) -> Result<u8, BrdbSchemaError>
fn as_brdb_u16(&self) -> Result<u16, BrdbSchemaError>
fn as_brdb_u32(&self) -> Result<u32, BrdbSchemaError>
fn as_brdb_u64(&self) -> Result<u64, BrdbSchemaError>
fn as_brdb_i8(&self) -> Result<i8, BrdbSchemaError>
fn as_brdb_i16(&self) -> Result<i16, BrdbSchemaError>
fn as_brdb_i32(&self) -> Result<i32, BrdbSchemaError>
fn as_brdb_i64(&self) -> Result<i64, BrdbSchemaError>
fn as_brdb_f32(&self) -> Result<f32, BrdbSchemaError>
fn as_brdb_f64(&self) -> Result<f64, BrdbSchemaError>
fn as_brdb_str(&self) -> Result<&str, BrdbSchemaError>
fn as_brdb_asset( &self, _schema: &BrdbSchema, _ty: &str, ) -> Result<Option<usize>, BrdbSchemaError>
fn as_brdb_enum( &self, _schema: &BrdbSchema, _def: &BrdbSchemaEnum, ) -> Result<i32, BrdbSchemaError>
fn as_brdb_wire_variant(&self) -> Result<WireVariant, BrdbSchemaError>
fn as_brdb_wire_array_variant( &self, ) -> Result<WireArrayVariant, BrdbSchemaError>
fn as_brdb_wire_map_variant(&self) -> Result<WireMapVariant, BrdbSchemaError>
Source§fn as_brdb_variant_member(&self) -> Option<&str>
fn as_brdb_variant_member(&self) -> Option<&str>
variant
(a tagged union whose members are structs, e.g. BRInventoryEntryVariant
-> BRInventoryEntryNothing), return the member struct’s name. The
writer emits uint(tag) + <that struct>. None (the default) means
“not a struct-member variant” and the writer falls back to the wire
map/array/scalar variant paths.Source§fn has_brdb_struct_prop(
&self,
_schema: &BrdbSchema,
_struct_name: BrdbInterned,
_prop_name: BrdbInterned,
) -> bool
fn has_brdb_struct_prop( &self, _schema: &BrdbSchema, _struct_name: BrdbInterned, _prop_name: BrdbInterned, ) -> bool
false, the schema writer takes the default/zero path directly
instead of paying for a MissingStructField error (two String
allocations) per unset field. Implementations that can’t answer
cheaply keep the default true; the writer then falls back to
the erroring accessors below.Source§fn as_brdb_struct_prop_map(
&self,
_schema: &BrdbSchema,
_struct_name: BrdbInterned,
_prop_name: BrdbInterned,
) -> Result<BrdbMapIter<'_>, BrdbSchemaError>
fn as_brdb_struct_prop_map( &self, _schema: &BrdbSchema, _struct_name: BrdbInterned, _prop_name: BrdbInterned, ) -> Result<BrdbMapIter<'_>, BrdbSchemaError>
Source§impl Clone for BrdbSchemaGlobalData
impl Clone for BrdbSchemaGlobalData
Source§fn clone(&self) -> BrdbSchemaGlobalData
fn clone(&self) -> BrdbSchemaGlobalData
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more