This commit is contained in:
Oscar
2025-07-25 22:49:56 +03:00
parent 03af6d458c
commit 860be9ac4c
470 changed files with 308020 additions and 436 deletions

View File

@@ -0,0 +1,44 @@
#include "pointer.hpp"
#include <iostream>
CPointer CPointer::GetFieldPtr(int offset) const {
if (IsValid()) {
return m_Value + offset;
}
LogInvalid();
static CPointer null{};
return &null;
}
CPointer& CPointer::Offset(int offset) {
if (IsValid()) {
m_Value += offset;
}
return *this;
}
CPointer& CPointer::Absolute(int preAbs, int postAbs) {
if (IsValid()) {
Offset(preAbs);
m_Value = m_Value + sizeof(int) + *reinterpret_cast<int*>(m_Value);
Offset(postAbs);
}
return *this;
}
CPointer& CPointer::Dereference(int count) {
if (IsValid()) {
while (count-- != 0) {
m_Value = *reinterpret_cast<uintptr_t*>(m_Value);
}
}
return *this;
}
void CPointer::LogInvalid() const { std::cout << "invalid offset\n"; }

View File

@@ -0,0 +1,49 @@
#pragma once
#include <cstdint>
#include <type_traits>
class CPointer {
public:
CPointer() { m_Value = 0; }
template <typename T>
CPointer(T value) {
m_Value = (uintptr_t)(value);
}
bool IsValid() const { return m_Value != 0; }
template <typename T>
auto Get() const {
return reinterpret_cast<T>(m_Value);
}
template <typename T>
std::add_lvalue_reference_t<T> GetField(int offset) const {
return *GetFieldPtr(offset).Get<T*>();
}
template <typename T, typename... Args>
auto Call(Args... args) const {
if constexpr (std::is_invocable_v<T, Args...>) {
if (IsValid()) {
return std::invoke(Get<T>(), std::forward<Args>(args)...);
}
} else {
static_assert(std::is_invocable_v<T, Args...>, "T must be an invocable type.");
}
LogInvalid();
return std::invoke_result_t<T, Args...>{};
}
CPointer GetFieldPtr(int offset) const;
CPointer& Offset(int offset);
CPointer& Absolute(int preAbs, int postAbs);
CPointer& Dereference(int count);
private:
void LogInvalid() const;
uintptr_t m_Value;
};