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.
This commit is contained in:
Bryce Wilkinson 2023-10-22 23:51:40 -04:00
parent 631668429c
commit 505630fefd
6 changed files with 75 additions and 24 deletions

View File

@ -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.

View File

@ -9,7 +9,7 @@ use crate::sdk::InterfaceReg;
use super::{generate_files, Entries};
pub fn dump_interfaces(builders: &mut Vec<FileBuilderEnum>, process: &Process) -> Result<()> {
pub fn dump_interfaces(builders: &mut Vec<FileBuilderEnum>, 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<FileBuilderEnum>, process: &Process) -
}
}
generate_files(builders, &entries, "interfaces")?;
generate_files(builders, &entries, "interfaces", &&path)?;
Ok(())
}

View File

@ -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.

View File

@ -117,7 +117,7 @@ mod tests {
}
}
pub fn dump_offsets(builders: &mut Vec<FileBuilderEnum>, process: &Process) -> Result<()> {
pub fn dump_offsets(builders: &mut Vec<FileBuilderEnum>, 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<FileBuilderEnum>, process: &Process) -> R
});
}
generate_files(builders, &entries, "offsets")?;
generate_files(builders, &entries, "offsets", &path)?;
Ok(())
}

View File

@ -7,7 +7,7 @@ use crate::sdk::SchemaSystem;
use super::{generate_files, Entries};
pub fn dump_schemas(builders: &mut Vec<FileBuilderEnum>, process: &Process) -> Result<()> {
pub fn dump_schemas(builders: &mut Vec<FileBuilderEnum>, 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<FileBuilderEnum>, process: &Process) -> R
}
}
generate_files(builders, &entries, &module_name)?;
generate_files(builders, &entries, &module_name, &&path)?;
}
Ok(())

View File

@ -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<FileBuilderEnum> = vec![
FileBuilderEnum::CppFileBuilder(CppFileBuilder),
FileBuilderEnum::CSharpFileBuilder(CSharpFileBuilder),
FileBuilderEnum::JsonFileBuilder(JsonFileBuilder::default()),
FileBuilderEnum::PythonFileBuilder(PythonFileBuilder),
FileBuilderEnum::RustFileBuilder(RustFileBuilder),
];
let mut active_builders: Vec<FileBuilderEnum> = 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();