t7x/src/client/game/game.hpp

85 lines
1.4 KiB
C++
Raw Normal View History

#pragma once
2023-01-01 19:12:14 -05:00
#include "structs.hpp"
#include <utils/nt.hpp>
namespace game
{
2022-11-11 11:19:26 -05:00
size_t get_base();
2023-01-01 15:46:36 -05:00
bool is_server();
2022-08-10 05:26:19 -04:00
2022-11-11 11:19:26 -05:00
inline size_t relocate(const size_t val)
{
2023-01-02 07:57:00 -05:00
if (!val) return 0;
2022-11-11 11:19:26 -05:00
const auto base = get_base();
return base + (val - 0x140000000);
}
inline size_t derelocate(const size_t val)
{
2023-01-02 07:57:00 -05:00
if (!val) return 0;
2022-11-11 11:19:26 -05:00
const auto base = get_base();
return (val - base) + 0x140000000;
}
inline size_t derelocate(const void* val)
{
return derelocate(reinterpret_cast<size_t>(val));
}
2022-06-02 07:49:43 -04:00
2023-01-02 07:57:00 -05:00
inline size_t select(const size_t client_val, const size_t server_val)
{
return relocate(is_server() ? server_val : client_val);
}
inline size_t select(const void* client_val, const void* server_val)
{
return select(reinterpret_cast<size_t>(client_val), reinterpret_cast<size_t>(server_val));
}
template <typename T>
class symbol
{
public:
symbol(const size_t address)
2022-11-09 11:10:08 -05:00
: address_(address)
{
}
2023-01-02 07:57:00 -05:00
symbol(const size_t address, const size_t server_address)
: address_(address)
, server_address_(server_address)
{
}
T* get() const
{
2023-01-02 07:57:00 -05:00
return reinterpret_cast<T*>(select(this->address_, this->server_address_));
}
2022-11-09 11:10:08 -05:00
operator T*() const
{
return this->get();
}
T* operator->() const
{
return this->get();
}
private:
2023-01-02 07:57:00 -05:00
size_t address_{};
size_t server_address_{};
};
}
2022-11-11 11:19:26 -05:00
inline size_t operator"" _g(const size_t val)
{
return game::relocate(val);
}
2023-01-02 07:57:00 -05:00
#include "structs.hpp"
#include "symbols.hpp"