From 505630fefda5d6eae504fcce5b686649cdebda36 Mon Sep 17 00:00:00 2001 From: Bryce Wilkinson Date: Sun, 22 Oct 2023 23:51:40 -0400 Subject: [PATCH] Add Builder Whitelist & Output Path ADDED: - Argument to specify only the builders we would like to use - Argument to specify an output folder * First time in my life developing in rust, if anything is programmed crappily I'd be happy to change it. Figured I'd submit for those who might find these features helpful. --- README.md | 22 ++++++++++++--- src/dumpers/interfaces.rs | 4 +-- src/dumpers/mod.rs | 9 ++++--- src/dumpers/offsets.rs | 4 +-- src/dumpers/schemas.rs | 4 +-- src/main.rs | 56 +++++++++++++++++++++++++++++++-------- 6 files changed, 75 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 57080b7..22c8c31 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,31 @@ -# cs2-dumper +# cs2-dumper External offsets/interfaces dumper for Counter-Strike: 2, written in Rust. + # Generated Files Generated files are stored in the `generated` directory. 📂 [Pre-generated Files](./generated) -# Running Tests +# Running The Application + Within CMD run: + `cs2_dumper --argument value --argument...` -`cargo test -- --nocapture` +## Available Arguments +| Argument | Type | Description | Default Value | Required +|--|--|--|--|--| +| interfaces | bool | Dump Interfaces | True | [] | +| offsets | bool | Dump Offsets | True | [] | +| schemas | bool | Dump Schemas | True | [] | +| dbuilders | String | Comma Separated String **without spaces** specifying the output file formats. Available Builders: [JSON, CPP, CSharp, Python, Rust] | Blank (All) | [] | +| path | String | Folder name for dumped assets | True | [x] | +| interfaces | bool | Dump Interfaces | True | [] | + # License -Please refer to the [LICENSE](./LICENSE) file for more details. + + +Please refer to the [LICENSE](./LICENSE) file for more details. \ No newline at end of file diff --git a/src/dumpers/interfaces.rs b/src/dumpers/interfaces.rs index 4d3e73f..dcb55a7 100644 --- a/src/dumpers/interfaces.rs +++ b/src/dumpers/interfaces.rs @@ -9,7 +9,7 @@ use crate::sdk::InterfaceReg; use super::{generate_files, Entries}; -pub fn dump_interfaces(builders: &mut Vec, process: &Process) -> Result<()> { +pub fn dump_interfaces(builders: &mut Vec, process: &Process, path: &String) -> Result<()> { let mut entries = Entries::new(); for module_name in process @@ -63,7 +63,7 @@ pub fn dump_interfaces(builders: &mut Vec, process: &Process) - } } - generate_files(builders, &entries, "interfaces")?; + generate_files(builders, &entries, "interfaces", &&path)?; Ok(()) } diff --git a/src/dumpers/mod.rs b/src/dumpers/mod.rs index dc6aaf4..e9de47d 100644 --- a/src/dumpers/mod.rs +++ b/src/dumpers/mod.rs @@ -6,7 +6,8 @@ use anyhow::Result; use chrono::Utc; -use crate::builder::{FileBuilder, FileBuilderEnum}; + +use crate::{builder::{FileBuilder, FileBuilderEnum}, main}; pub use interfaces::dump_interfaces; pub use offsets::dump_offsets; @@ -39,12 +40,13 @@ pub fn generate_file( builder: &mut FileBuilderEnum, entries: &Entries, file_name: &str, + path: &&String, ) -> Result<()> { if entries.is_empty() { return Ok(()); } - let file_path = format!("generated/{}.{}", file_name, builder.extension()); + let file_path = format!("{}/{}.{}", path, file_name, builder.extension()); let mut file = File::create(file_path)?; @@ -77,10 +79,11 @@ pub fn generate_files( builders: &mut [FileBuilderEnum], entries: &Entries, file_name: &str, + path: &&String, ) -> Result<()> { builders .iter_mut() - .try_for_each(|builder| generate_file(builder, entries, file_name)) + .try_for_each(|builder| generate_file(builder, entries, file_name, &&path)) } /// Writes the banner to the given file. diff --git a/src/dumpers/offsets.rs b/src/dumpers/offsets.rs index 13628cd..00d92de 100644 --- a/src/dumpers/offsets.rs +++ b/src/dumpers/offsets.rs @@ -117,7 +117,7 @@ mod tests { } } -pub fn dump_offsets(builders: &mut Vec, process: &Process) -> Result<()> { +pub fn dump_offsets(builders: &mut Vec, process: &Process, path: &String) -> Result<()> { let file = File::open("config.json")?; let config: Config = serde_json::from_reader(file)?; @@ -205,7 +205,7 @@ pub fn dump_offsets(builders: &mut Vec, process: &Process) -> R }); } - generate_files(builders, &entries, "offsets")?; + generate_files(builders, &entries, "offsets", &path)?; Ok(()) } diff --git a/src/dumpers/schemas.rs b/src/dumpers/schemas.rs index 4f31993..d9d7b0b 100644 --- a/src/dumpers/schemas.rs +++ b/src/dumpers/schemas.rs @@ -7,7 +7,7 @@ use crate::sdk::SchemaSystem; use super::{generate_files, Entries}; -pub fn dump_schemas(builders: &mut Vec, process: &Process) -> Result<()> { +pub fn dump_schemas(builders: &mut Vec, process: &Process, path: &String) -> Result<()> { let schema_system = SchemaSystem::new(&process)?; for type_scope in schema_system.type_scopes()? { @@ -44,7 +44,7 @@ pub fn dump_schemas(builders: &mut Vec, process: &Process) -> R } } - generate_files(builders, &entries, &module_name)?; + generate_files(builders, &entries, &module_name, &&path)?; } Ok(()) diff --git a/src/main.rs b/src/main.rs index 6c0e1dc..3e53046 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,6 +33,12 @@ struct Args { #[arg(short, long)] schemas: bool, + #[arg(short, long)] + dbuilders: String, + + #[arg(short, long)] + path: String, + #[arg(short, long)] verbose: bool, } @@ -42,6 +48,8 @@ fn main() -> Result<()> { interfaces, offsets, schemas, + dbuilders, + path, verbose, } = Args::parse(); @@ -61,28 +69,54 @@ fn main() -> Result<()> { let process = Process::new("cs2.exe")?; - fs::create_dir_all("generated")?; + fs::create_dir_all(path.clone())?; - let mut builders: Vec = vec![ - FileBuilderEnum::CppFileBuilder(CppFileBuilder), - FileBuilderEnum::CSharpFileBuilder(CSharpFileBuilder), - FileBuilderEnum::JsonFileBuilder(JsonFileBuilder::default()), - FileBuilderEnum::PythonFileBuilder(PythonFileBuilder), - FileBuilderEnum::RustFileBuilder(RustFileBuilder), - ]; + let mut active_builders: Vec = Vec::new(); + + + if dbuilders.len() == 0 { + active_builders = vec![ + FileBuilderEnum::CppFileBuilder(CppFileBuilder), + FileBuilderEnum::CSharpFileBuilder(CSharpFileBuilder), + FileBuilderEnum::JsonFileBuilder(JsonFileBuilder::default()), + FileBuilderEnum::PythonFileBuilder(PythonFileBuilder), + FileBuilderEnum::RustFileBuilder(RustFileBuilder), + ]; + } + + let configured_builders = dbuilders.split(","); + + for active_builder in configured_builders { + if active_builder.eq_ignore_ascii_case("JSON"){ + active_builders.push(FileBuilderEnum::JsonFileBuilder(JsonFileBuilder::default())); + }else if active_builder.eq_ignore_ascii_case("CPP") { + active_builders.push(FileBuilderEnum::CppFileBuilder(CppFileBuilder)); + }else if active_builder.eq_ignore_ascii_case("CSharp") { + active_builders.push(FileBuilderEnum::CSharpFileBuilder(CSharpFileBuilder)); + } else if active_builder.eq_ignore_ascii_case("Python") { + active_builders.push(FileBuilderEnum::PythonFileBuilder(PythonFileBuilder)); + }else if active_builder.eq_ignore_ascii_case("Rust") { + active_builders.push(FileBuilderEnum::RustFileBuilder(RustFileBuilder)); + } + } + + let all = !(interfaces || offsets || schemas); + let test = path.clone(); + + if schemas || all { - dump_schemas(&mut builders, &process)?; + dump_schemas(&mut active_builders, &process, &test)?; } if interfaces || all { - dump_interfaces(&mut builders, &process)?; + dump_interfaces(&mut active_builders, &process, &&test)?; } if offsets || all { - dump_offsets(&mut builders, &process)?; + dump_offsets(&mut active_builders, &process, &&&test)?; } let duration = start_time.elapsed();