Huge protection improvements and other stuff (#1963)

* feat(protections): add a fuzzer
* feat(protections): improve protections
* feat(spoofing): add warning
* feat(world): force object cleanup
* fix(weapons): fix custom weapon code
* fix(weapons): fix for #1983
This commit is contained in:
maybegreat48
2023-08-19 11:01:08 +00:00
committed by GitHub
parent 9a51d381c9
commit 5eead0436f
120 changed files with 15579 additions and 20690 deletions

View File

@ -1029,13 +1029,13 @@ enum class BlipColors
enum BlipDisplayBits
{
BlipShowCheckmark = (1 << 16),
BlipShowDollarSign = (1 << 17),
BlipShowHeadingIndicator = (1 << 18),
BlipShowFullCircle = (1 << 19),
BlipIsFriend = (1 << 20),
BlipIsCrew = (1 << 21),
BlipIsSelected = (1 << 23),
BlipShowCheckmark = (1 << 16),
BlipShowDollarSign = (1 << 17),
BlipShowHeadingIndicator = (1 << 18),
BlipShowFullCircle = (1 << 19),
BlipIsFriend = (1 << 20),
BlipIsCrew = (1 << 21),
BlipIsSelected = (1 << 23),
};
enum class BlipRenderBits
@ -1069,6 +1069,23 @@ enum class eNetObjType
NET_OBJ_TYPE_TRAIN
};
constexpr const auto net_object_type_strs = std::to_array({
"AUTOMOBILE",
"BIKE",
"BOAT",
"DOOR",
"HELI",
"OBJECT",
"PED",
"PICKUP",
"PICKUP_PLACEMENT",
"PLANE",
"SUBMARINE",
"PLAYER",
"TRAILER",
"TRAIN",
});
enum class eNetObjectFlags : uint16_t
{
NET_OBJ_FLAGS_FROM_SCRIPT = 1 << 2,

View File

@ -10,47 +10,47 @@ namespace rage
class scrNativeCallContext
{
public:
void reset()
constexpr void reset()
{
m_arg_count = 0;
m_data_count = 0;
}
template<typename T>
void push_arg(T&& value)
constexpr void push_arg(T&& value)
{
static_assert(sizeof(T) <= sizeof(uint64_t));
*reinterpret_cast<std::remove_cv_t<std::remove_reference_t<T>>*>(reinterpret_cast<uint64_t*>(m_args) + (m_arg_count++)) = std::forward<T>(value);
}
template<typename T>
T& get_arg(std::size_t index)
constexpr T& get_arg(std::size_t index)
{
static_assert(sizeof(T) <= sizeof(uint64_t));
return *reinterpret_cast<T*>(reinterpret_cast<uint64_t*>(m_args) + index);
}
template<typename T>
void set_arg(std::size_t index, T&& value)
constexpr void set_arg(std::size_t index, T&& value)
{
static_assert(sizeof(T) <= sizeof(uint64_t));
*reinterpret_cast<std::remove_cv_t<std::remove_reference_t<T>>*>(reinterpret_cast<uint64_t*>(m_args) + index) = std::forward<T>(value);
}
template<typename T>
T* get_return_value()
constexpr T* get_return_value()
{
return reinterpret_cast<T*>(m_return_value);
}
template<typename T>
void set_return_value(T&& value)
constexpr void set_return_value(T&& value)
{
*reinterpret_cast<std::remove_cv_t<std::remove_reference_t<T>>*>(m_return_value) = std::forward<T>(value);
}
template<typename T>
void set_return_value(T& value)
constexpr void set_return_value(T& value)
{
*reinterpret_cast<std::remove_cv_t<std::remove_reference_t<T>>*>(m_return_value) = std::forward<T>(value);
}

View File

@ -8,41 +8,51 @@
#pragma pack(push, 1)
namespace rage
{
#pragma pack(push, 8)
class CSyncDataBase
{
public:
virtual ~CSyncDataBase() = default;
virtual bool SerializeDword(uint32_t* dword, int size) = 0;
virtual bool SerializeWord(uint16_t* word, int size) = 0;
virtual bool SerializeByte(uint8_t* byte, int size) = 0;
virtual bool SerializeInt32(int32_t* i, int size) = 0;
virtual bool SerializeInt16(int16_t* i, int size) = 0;
virtual bool SerializeSignedByte(int8_t* byte, int size) = 0;
virtual bool SerializeBool(bool* flag) = 0;
virtual bool SerializeInt64(int64_t* i, int size) = 0;
virtual bool SerializeInt32Alt(int32_t* i, int size) = 0;
virtual bool SerializeInt16Alt(int16_t* i, int size) = 0;
virtual bool SerializeSignedByteAlt(int8_t* byte, int size) = 0;
virtual bool SerializeQword(uint64_t* qword, int size) = 0;
virtual bool SerializeDwordAlt(uint32_t* dword, int size) = 0;
virtual bool SerializeWordAlt(uint16_t* word, int size) = 0;
virtual bool SerializeByteAlt(uint8_t* byte, int size) = 0;
virtual bool SerializeSignedFloat(float* flt, float divisor, int size) = 0;
virtual bool SerializeFloat(float* flt, float divisor, int size) = 0;
virtual bool SerializeNetworkId(uint16_t* net_id) = 0;
virtual bool SerializeVector3(rage::fvector3* vec3, float divisor, int size) = 0;
virtual bool SerializeDword(uint32_t* dword, int size) = 0; // 1
virtual bool SerializeWord(uint16_t* word, int size) = 0; // 2
virtual bool SerializeByte(uint8_t* byte, int size) = 0; // 3
virtual bool SerializeInt32(int32_t* i, int size) = 0; // 4
virtual bool SerializeInt16(int16_t* i, int size) = 0; // 5
virtual bool SerializeSignedByte(int8_t* byte, int size) = 0; // 6
virtual bool SerializeBool(bool* flag) = 0; // 7
virtual bool SerializeInt64(int64_t* i, int size) = 0; // 8
virtual bool SerializeInt32Alt(int32_t* i, int size) = 0; // 9
virtual bool SerializeInt16Alt(int16_t* i, int size) = 0; // 10
virtual bool SerializeSignedByteAlt(int8_t* byte, int size) = 0; // 11
virtual bool SerializeQword(uint64_t* qword, int size) = 0; // 12
virtual bool SerializeDwordAlt(uint32_t* dword, int size) = 0; // 13
virtual bool SerializeWordAlt(uint16_t* word, int size) = 0; // 14
virtual bool SerializeByteAlt(uint8_t* byte, int size) = 0; // 15
virtual bool SerializeSignedFloat(float* flt, float divisor, int size) = 0; // 16
virtual bool SerializeFloat(float* flt, float divisor, int size) = 0; // 17
virtual bool SerializeNetworkId(uint16_t* net_id) = 0; // 18
virtual bool SerializeVector3(rage::fvector3* vec3, float divisor, int size) = 0; // 19
virtual bool SerializeQuaternion(void* unk) = 0; // i have no clue what that is
virtual bool SerializeVector3SignedZComponent(rage::fvector3* vec3, float divisor, int size) = 0;
virtual bool SerializeVector3SignedZComponent(rage::fvector3* vec3, float divisor, int size) = 0; // 21
virtual bool SerializeOrientation(rage::fvector4* vec4, float size) = 0; // yes, the size is a float
virtual bool SerializeArray(void* array, int size) = 0;
virtual bool SerializeString(char* str, int max_length) = 0;
virtual bool IsSizeCalculator() = 0;
virtual bool IsSizeCalculator2() = 0;
void* unk_0x8;
void* syncLog;
datBitBuffer* buffer;
enum class Type
{
Reader = 1,
Writer,
SizeCalculator,
Logger
};
Type m_type;
void* m_sync_log;
datBitBuffer* m_buffer;
};
#pragma pack(pop)
class netPlayer;
@ -627,6 +637,7 @@ namespace rage
uint32_t m_0x28; // 0x28
char m_padding2[0x04];
};
static_assert(sizeof(rage::netGameEvent) == 0x30);
}
class CScriptedGameEvent : public rage::netGameEvent
@ -644,4 +655,11 @@ public:
Hash m_stat; // 0x30
uint32_t m_amount; // 0x34
};
class CDoorBreakEvent : public rage::netGameEvent
{
public:
std::uint16_t m_vehicle_id; // 0x30
std::uint8_t m_door_id; // 0x32
};
#pragma pack(pop)

View File

@ -112,7 +112,7 @@ public:
inline UINT64 get_address(UINT32 i)
{
return mask(i) & (m_pool_address + i * m_item_size);
return mask(i) & (m_pool_address + (uint64_t)i * m_item_size);
}
inline int get_item_count()