Skip to content

Commit

Permalink
Hotfix for the runtime schema resolver. Needs proper implementation!
Browse files Browse the repository at this point in the history
  • Loading branch information
WolverinDEV committed Apr 4, 2024
1 parent f4cce88 commit 0dae7f7
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 44 deletions.
141 changes: 99 additions & 42 deletions cs2/src/offsets_runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ use crate::{
find_schema_system,
CS2Handle,
CSchemaSystem,
CSchemaTypeDeclaredClass,
Module,
RBTreeDeclaredList,
};

#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord)]
Expand Down Expand Up @@ -76,51 +78,106 @@ fn load_runtime_offsets(

let scope_name = scope.scope_name()?.to_string_lossy()?;

let class_bindings = scope.class_bindings()?.read_values()?;
log::trace!(
" {:X} {} with {} classes",
scope_ptr.address()?,
scope_name,
class_bindings.len(),
);

for schema_class in class_bindings {
let binding = schema_class.read_schema()?;
let schema_name = binding
.type_scope()?
.read_schema()?
.scope_name()?
.to_string_lossy()?;

let class_name: String = binding.name()?.read_string()?;
log::trace!(
" {:X} {} -> {}",
schema_class.address()?,
class_name,
schema_name
);
if !["client.dll", "!GlobalTypes"].contains(&schema_name.as_str()) {
continue;
}

let class_member = binding
.fields()?
.read_entries(binding.field_size()? as usize)?;

for class_member in class_member {
let member_name = class_member.name()?.read_string()?;
let member_offset = class_member.offset()?;

result.insert(
RegisteredOffset {
module: schema_name.clone(),
class: class_name.clone(),
member: member_name,
},
member_offset,
log::trace!("Name: {} @ {:X}", scope_name, scope_ptr.address()?);
//continue;
{
let tree = scope.memory.reference_schema::<RBTreeDeclaredList>(0x4C8)?;
let entries = tree.entries()?.read_entries(tree.entry_count()? as usize)?;

for entry in entries {
if entry.entry()?.is_null()? {
continue;
}

let entry = entry
.entry()?
.cast::<CSchemaTypeDeclaredClass>()
.reference_schema()?;

let schema_class = entry.declaration()?;
let binding = schema_class.read_schema()?;
let schema_name = binding
.type_scope()?
.read_schema()?
.scope_name()?
.to_string_lossy()?;

let class_name: String = binding.name()?.read_string()?;
log::trace!(
" {:X} {} -> {}",
schema_class.address()?,
class_name,
schema_name
);
if !["client.dll", "!GlobalTypes"].contains(&schema_name.as_str()) {
continue;
}

let class_member = binding
.fields()?
.read_entries(binding.field_size()? as usize)?;

for class_member in class_member {
let member_name = class_member.name()?.read_string()?;
let member_offset = class_member.offset()?;

result.insert(
RegisteredOffset {
module: schema_name.clone(),
class: class_name.clone(),
member: member_name,
},
member_offset,
);
}
}
}

// let class_bindings = scope.class_bindings()?.read_values()?;
// log::trace!(
// " {:X} {} with {} classes",
// scope_ptr.address()?,
// scope_name,
// class_bindings.len(),
// );

// for schema_class in class_bindings {
// let binding = schema_class.read_schema()?;
// let schema_name = binding
// .type_scope()?
// .read_schema()?
// .scope_name()?
// .to_string_lossy()?;

// let class_name: String = binding.name()?.read_string()?;
// log::trace!(
// " {:X} {} -> {}",
// schema_class.address()?,
// class_name,
// schema_name
// );
// if !["client.dll", "!GlobalTypes"].contains(&schema_name.as_str()) {
// continue;
// }

// let class_member = binding
// .fields()?
// .read_entries(binding.field_size()? as usize)?;

// for class_member in class_member {
// let member_name = class_member.name()?.read_string()?;
// let member_offset = class_member.offset()?;

// result.insert(
// RegisteredOffset {
// module: schema_name.clone(),
// class: class_name.clone(),
// member: member_name,
// },
// member_offset,
// );
// }
// }
}

Ok(result)
Expand Down
22 changes: 20 additions & 2 deletions cs2/src/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,25 @@ define_schema! {
None = 7,
}

pub struct RBTreeDeclaredList[0x30] {
// pub comperator: fn(...) -> bool = 0x00,
pub entries: Ptr<[RBTreeDeclaredListEntry]> = 0x08,
pub entry_count: u16 = 0x1A,
pub start_node: i16 = 0x18,
}

pub struct RBTreeDeclaredListEntry[0x18] {
pub left_leaf: i16 = 0x00,
pub right_leaf: i16 = 0x02,
// pub
pub entry: Ptr<()> = 0x10,
}

pub struct CSchemaSystem[0x200] {
pub scopes: CUtlVector<Ptr<CSchemaSystemTypeScope>> = 0x190,
}

pub struct CSchemaSystemTypeScope[0x2F30] {
pub struct CSchemaSystemTypeScope[0x56E0] {
pub scope_name: FixedCString<0x100> = 0x08,
pub class_bindings: CUtlTSHash<u64, Ptr<CSchemaClassBinding>> = 0x05B8,
pub enum_bindings: CUtlTSHash<u64, Ptr<CSchemaEnumBinding>> = 0x2E00,
Expand All @@ -87,11 +101,15 @@ define_schema! {
pub atomic_category: AtomicCategory = 0x19,
}

pub struct CSchemaTypeBuildin[0x28] : CSchemaType {
pub index: u8 = 0x20,
}

pub struct CSchemaTypeDeclaredEnum[0x28] : CSchemaType {
pub declaration: Ptr<CSchemaEnumBinding> = 0x20,
}

pub struct CSchemaTypeDeclaredClass[0x28] : CSchemaType {
pub struct CSchemaTypeDeclaredClass[0x30] : CSchemaType {
pub declaration: Ptr<CSchemaClassBinding> = 0x20,
}

Expand Down

0 comments on commit 0dae7f7

Please sign in to comment.