load_scripts/
load_scripts.rs

1use std::{
2    fs::File,
3    io::{BufWriter, Write},
4};
5
6use infinite_rs::{ModuleFile, Result, tag::types::common_types::FieldData};
7use infinite_rs_derive::TagStructure;
8
9const DEPLOY_PATH: &str =
10    "C:/XboxGames/Halo Infinite/Content/deploy/any/globals/globals-rtx-new.module";
11const SAVE_PATH: &str = "./scripts";
12const SCRIPT_GROUP: &str = "hsc*";
13
14#[derive(Default, Debug, TagStructure)]
15#[data(size(0x2D8))]
16struct HsSourceFileTag {
17    #[data(offset(0x294))]
18    server: FieldData,
19    #[data(offset(0x2AC))]
20    client: FieldData,
21}
22
23fn main() -> Result<()> {
24    let mut module = ModuleFile::from_path(DEPLOY_PATH)?;
25    for idx in 0..module.files.len() {
26        if module.files[idx].tag_group == SCRIPT_GROUP {
27            let tag = module.read_tag(idx as u32)?;
28            if let Some(tag) = tag {
29                let source = tag.read_metadata::<HsSourceFileTag>()?;
30
31                let server_buf = source.server.data;
32                let client_buf = source.client.data;
33
34                let server_file = File::create(format!("{SAVE_PATH}/{}_server.luac", tag.tag_id))?;
35                let mut bw = BufWriter::new(server_file);
36                bw.write_all(&server_buf)?;
37
38                let client_file = File::create(format!("{SAVE_PATH}/{}_client.luac", tag.tag_id))?;
39                let mut bw = BufWriter::new(client_file);
40                bw.write_all(&client_buf)?;
41            }
42        }
43    }
44    Ok(())
45}