mirror of
https://github.com/a2x/cs2-dumper.git
synced 2025-06-06 18:25:35 +08:00
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:
parent
631668429c
commit
505630fefd
22
README.md
22
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.
|
@ -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(())
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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(())
|
||||
}
|
||||
|
@ -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(())
|
||||
|
56
src/main.rs
56
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<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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user