summaryrefslogtreecommitdiff
path: root/loader/util.hpp
blob: 68de3fb01654e2118bc53553e26e6515b41f4b75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#pragma once
#include <inttypes.h>
#include <string>
#include <memory>

#define xors( s ) s

#define NAMESPACE_REGION( x ) namespace x {
#define END_REGION }

extern int TIME_TO_TICKS( float dt );
extern float TICKS_TO_TIME( int tick );
extern float TICK_INTERVAL( );

//WEE WOO WEE WOO ITS THE DWORD POLICE
using ulong_t = unsigned long;
using uword_t = unsigned short;

class IClientEntity;
class CTraceFilter;
class CGameTrace;
class vec3_t;
class vec2_t;

NAMESPACE_REGION( util )

typedef std::unique_ptr< void, void( ) > unique_handle;

template < typename t >
struct reverse_iterable {
	reverse_iterable( t&& it ) :
		iterable( it ) { }

	t& iterable;
	inline auto begin( ) {
		return std::rbegin( iterable );
	}

	inline auto end( ) {
		return std::rend( iterable );
	}
};

template< typename t >
reverse_iterable< t >
reverse_iterator( t&& iter ) {
	return reverse_iterable< t >{ iter };
}

template < typename fn > __forceinline fn get_vfunc( void* classbase, int index ) {
	if( !classbase ) return fn{ };
	return ( fn )( *( uintptr_t** )classbase )[ index ];
}

template < size_t index, typename ret, class ... args_ >
__forceinline ret get_vfunc( void* thisptr, args_... args ) {
	using fn = ret( __thiscall* )( void*, args_... );

	auto fn_ptr = ( fn )( *( uintptr_t** )thisptr )[ index ];
	return fn_ptr( thisptr, args... );
}

__forceinline std::string unicode_to_ascii( const std::wstring& unicode ) {
	std::string ascii_str( unicode.begin( ), unicode.end( ) );
	return ascii_str;
}

__forceinline std::wstring ascii_to_unicode( const std::string& ascii ) {
	std::wstring unicode_str( ascii.begin( ), ascii.end( ) );
	return unicode_str;
}

template < typename integer >
__forceinline auto to_hex_str( const integer& w,
	size_t hex_len = sizeof( integer ) << 1 ) {
	constexpr char* hex_digits = xors( "0123456789abcdef" );
	std::string rc( hex_len, 0 );

	for( size_t i{ }, j{ ( hex_len - 1 ) * 4 }; i < hex_len; ++i, j -= 4 )
		rc[ i ] = hex_digits[ ( w >> j ) & 0x0f ];

	return rc;
}

extern void clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end,
	unsigned mask, CTraceFilter* filter, CGameTrace* trace );

extern bool trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b );
extern bool is_tick_valid( int tickcount );
extern void set_random_seed( int seed );
extern vec3_t get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed );
extern float get_random_float( float min, float max );
extern bool hitchance( int target, const vec3_t& angles, int percentage );
extern float get_total_latency( );
extern float get_lerptime( );
extern int get_closest_player( );
extern vec2_t screen_transform( vec3_t world );
extern const char* definition_index_to_name( int index );
extern void disable_pvs( );

END_REGION