From bbae85f5f0e2381d71c1959973b0f592a750d98f Mon Sep 17 00:00:00 2001
From: OnlyRealNubs <91900600+OnlyRealNubs@users.noreply.github.com>
Date: Fri, 17 Jun 2022 11:38:23 -0400
Subject: [PATCH 1/5] Added "Monster Trucks" effect
---
ChaosMod/ChaosMod.vcxproj | 1 +
ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp | 72 ++++++++++++++
ChaosMod/Memory/Vehicle.h | 94 +++++++++++++++++++
3 files changed, 167 insertions(+)
create mode 100644 ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
diff --git a/ChaosMod/ChaosMod.vcxproj b/ChaosMod/ChaosMod.vcxproj
index c6cc7cdf9..dacb5106a 100644
--- a/ChaosMod/ChaosMod.vcxproj
+++ b/ChaosMod/ChaosMod.vcxproj
@@ -190,6 +190,7 @@
+
diff --git a/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp b/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
new file mode 100644
index 000000000..e14a7e695
--- /dev/null
+++ b/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
@@ -0,0 +1,72 @@
+#include
+
+#include "Memory/Vehicle.h"
+
+struct VehicleData
+{
+ float fRaise;
+};
+
+std::map vehiclesMap;
+std::map vehiclesCGMap;
+
+static const float fWheelScale = 1.8f;
+
+static void OnStop()
+{
+ for (auto const &[model, data] : vehiclesMap)
+ {
+ LoadModel(model);
+ Vehicle temp = CREATE_VEHICLE(model, 0.f, 0.f, -50.f, 0.f, true, false, true);
+ FREEZE_ENTITY_POSITION(temp, true);
+
+ Memory::SetVehicleRaise(temp, data.fRaise);
+
+ DELETE_ENTITY(&temp);
+ vehiclesMap.erase(model);
+ }
+
+ for (auto const &[veh, CG] : vehiclesCGMap)
+ {
+ SET_CGOFFSET(veh, CG.x, CG.y, CG.z);
+ }
+
+ vehiclesMap.clear();
+ vehiclesCGMap.clear();
+}
+
+static void OnTick()
+{
+ for (Vehicle veh : GetAllVehs())
+ {
+ if (!DOES_ENTITY_EXIST(veh))
+ continue;
+
+ Hash vehModel = GET_ENTITY_MODEL(veh);
+ if (!vehiclesMap.contains(vehModel))
+ {
+ Memory::SetVehicleRaise(veh, 1.f);
+
+ _SET_VEHICLE_WHEELS_DEAL_DAMAGE(veh, true);
+
+ vehiclesMap.emplace(vehModel, VehicleData(0.f));
+ }
+
+ if (!vehiclesCGMap.contains(veh))
+ {
+ Vector3 ogCG = GET_CGOFFSET(veh);
+ SET_CGOFFSET(veh, ogCG.x, ogCG.y, ogCG.z - 0.8f);
+
+ vehiclesCGMap.emplace(veh, ogCG);
+ }
+ }
+}
+
+// clang-format off
+REGISTER_EFFECT(nullptr, OnStop, OnTick, EffectInfo
+ {
+ .Name = "Monster Trucks",
+ .Id = "vehs_monster_trucks",
+ .IsTimed = true
+ }
+);
\ No newline at end of file
diff --git a/ChaosMod/Memory/Vehicle.h b/ChaosMod/Memory/Vehicle.h
index a30ff14a9..a1252eb73 100644
--- a/ChaosMod/Memory/Vehicle.h
+++ b/ChaosMod/Memory/Vehicle.h
@@ -211,4 +211,98 @@ namespace Memory
Memory::SetVector3(vehicleMatrixAddress + 0x10, vehicleRightVec * scaleMultiplier);
Memory::SetVector3(vehicleMatrixAddress + 0x20, vehicleUpVec * scaleMultiplier);
}
+
+ inline void SetVehicleRaise(Vehicle vehicle, float height)
+ {
+ auto vehAddr = getScriptHandleBaseAddress(vehicle);
+ *reinterpret_cast(*reinterpret_cast(vehAddr + 0x938) + 0xD0) = height;
+ }
+
+ inline void SetVehicleWheelSize(Vehicle vehicle, float size)
+ {
+ auto addr = hook::get_pattern("44 0F 2F 43 48 45 8D");
+ auto vehAddr = getScriptHandleBaseAddress(vehicle);
+
+ auto drawHandlerPtrOffset = *(uint8_t *)(addr + 4);
+ auto streamRenderGfxPtrOffset = *hook::get_pattern("4C 8D 48 ? 80 E1 01", -4);
+
+ auto drawHandler = *reinterpret_cast((uint64_t)vehAddr + drawHandlerPtrOffset);
+ auto streamRenderGfx = *reinterpret_cast(drawHandler + streamRenderGfxPtrOffset);
+
+ if (streamRenderGfx == 0)
+ {
+ return;
+ }
+
+ addr = hook::get_pattern("48 89 01 B8 00 00 80 3F 66 44 89 51");
+ auto streamRenderWheelSizeOffset = *(uint8_t *)(addr + 20);
+
+ *reinterpret_cast(streamRenderGfx + streamRenderWheelSizeOffset) = size;
+ }
+
+ inline float GetVehicleWheelSize(Vehicle vehicle)
+ {
+ auto addr = hook::get_pattern("44 0F 2F 43 48 45 8D");
+ auto vehAddr = getScriptHandleBaseAddress(vehicle);
+
+ auto drawHandlerPtrOffset = *(uint8_t *)(addr + 4);
+ auto streamRenderGfxPtrOffset = *hook::get_pattern("4C 8D 48 ? 80 E1 01", -4);
+
+ auto drawHandler = *reinterpret_cast((uint64_t)vehAddr + drawHandlerPtrOffset);
+ auto streamRenderGfx = *reinterpret_cast(drawHandler + streamRenderGfxPtrOffset);
+
+ if (streamRenderGfx == 0)
+ {
+ return 0.f;
+ }
+
+ addr = hook::get_pattern("48 89 01 B8 00 00 80 3F 66 44 89 51");
+ auto streamRenderWheelSizeOffset = *(uint8_t *)(addr + 20);
+
+ return *reinterpret_cast(streamRenderGfx + streamRenderWheelSizeOffset);
+ }
+
+ inline void SetVehicleWheelWidth(Vehicle vehicle, float width)
+ {
+ auto addr = hook::get_pattern("44 0F 2F 43 48 45 8D");
+ auto vehAddr = getScriptHandleBaseAddress(vehicle);
+
+ auto drawHandlerPtrOffset = *(uint8_t *)(addr + 4);
+ auto streamRenderGfxPtrOffset = *hook::get_pattern("4C 8D 48 ? 80 E1 01", -4);
+
+ auto drawHandler = *reinterpret_cast((uint64_t)vehAddr + drawHandlerPtrOffset);
+ auto streamRenderGfx = *reinterpret_cast(drawHandler + streamRenderGfxPtrOffset);
+
+ if (streamRenderGfx == 0)
+ {
+ return;
+ }
+
+ addr = hook::get_pattern("48 89 01 B8 00 00 80 3F 66 44 89 51");
+ auto streamRenderWheelWidthOffset = *(uint32_t *)(addr + 23);
+
+ *reinterpret_cast(streamRenderGfx + streamRenderWheelWidthOffset) = width;
+ }
+
+ inline float GetVehicleWheelWidth(Vehicle vehicle)
+ {
+ auto addr = hook::get_pattern("44 0F 2F 43 48 45 8D");
+ auto vehAddr = getScriptHandleBaseAddress(vehicle);
+
+ auto drawHandlerPtrOffset = *(uint8_t *)(addr + 4);
+ auto streamRenderGfxPtrOffset = *hook::get_pattern("4C 8D 48 ? 80 E1 01", -4);
+
+ auto drawHandler = *reinterpret_cast((uint64_t)vehAddr + drawHandlerPtrOffset);
+ auto streamRenderGfx = *reinterpret_cast(drawHandler + streamRenderGfxPtrOffset);
+
+ if (streamRenderGfx == 0)
+ {
+ return 0.f;
+ }
+
+ addr = hook::get_pattern("48 89 01 B8 00 00 80 3F 66 44 89 51");
+ auto streamRenderWheelWidthOffset = *(uint32_t *)(addr + 23);
+
+ return *reinterpret_cast(streamRenderGfx + streamRenderWheelWidthOffset);
+ }
}
\ No newline at end of file
From 61b971bd8137a0e9042750a527b5027a72d5ff4b Mon Sep 17 00:00:00 2001
From: OnlyRealNubs <91900600+OnlyRealNubs@users.noreply.github.com>
Date: Fri, 17 Jun 2022 11:46:35 -0400
Subject: [PATCH 2/5] Fix Rolling
---
ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp b/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
index e14a7e695..748a0e21c 100644
--- a/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
+++ b/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
@@ -10,8 +10,6 @@ struct VehicleData
std::map vehiclesMap;
std::map vehiclesCGMap;
-static const float fWheelScale = 1.8f;
-
static void OnStop()
{
for (auto const &[model, data] : vehiclesMap)
@@ -55,7 +53,7 @@ static void OnTick()
if (!vehiclesCGMap.contains(veh))
{
Vector3 ogCG = GET_CGOFFSET(veh);
- SET_CGOFFSET(veh, ogCG.x, ogCG.y, ogCG.z - 0.8f);
+ SET_CGOFFSET(veh, ogCG.x, ogCG.y, ogCG.z - 1.2f);
vehiclesCGMap.emplace(veh, ogCG);
}
From bca2be1c93e02f6245b8e036029f93686b548659 Mon Sep 17 00:00:00 2001
From: OnlyRealNubs <91900600+OnlyRealNubs@users.noreply.github.com>
Date: Wed, 1 Feb 2023 20:33:20 -0500
Subject: [PATCH 3/5] Update ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
Co-authored-by: pongo1231
---
ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp b/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
index 748a0e21c..b68c72acc 100644
--- a/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
+++ b/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
@@ -7,8 +7,8 @@ struct VehicleData
float fRaise;
};
-std::map vehiclesMap;
-std::map vehiclesCGMap;
+static std::map vehiclesMap;
+static std::map vehiclesCGMap;
static void OnStop()
{
From e3a0fdd9c01a4e6d0323e297d6f2bfe68300a24c Mon Sep 17 00:00:00 2001
From: OnlyRealNubs <91900600+OnlyRealNubs@users.noreply.github.com>
Date: Wed, 1 Feb 2023 20:33:57 -0500
Subject: [PATCH 4/5] Update ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
Co-authored-by: pongo1231
---
ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp b/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
index b68c72acc..7c88dd7fe 100644
--- a/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
+++ b/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
@@ -60,7 +60,7 @@ static void OnTick()
}
}
-// clang-format off
+// clang-format off
REGISTER_EFFECT(nullptr, OnStop, OnTick, EffectInfo
{
.Name = "Monster Trucks",
From b921ca81eeed213f89e1280962d34eb86b2af02b Mon Sep 17 00:00:00 2001
From: OnlyRealNubs <91900600+OnlyRealNubs@users.noreply.github.com>
Date: Wed, 1 Feb 2023 20:34:34 -0500
Subject: [PATCH 5/5] Update VehsMonterTrucks.cpp
---
ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp b/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
index 7c88dd7fe..23482bf57 100644
--- a/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
+++ b/ChaosMod/Effects/db/Vehs/VehsMonterTrucks.cpp
@@ -41,7 +41,7 @@ static void OnTick()
continue;
Hash vehModel = GET_ENTITY_MODEL(veh);
- if (!vehiclesMap.contains(vehModel))
+ if (!vehiclesMap.contains(vehModel))
{
Memory::SetVehicleRaise(veh, 1.f);
@@ -67,4 +67,4 @@ REGISTER_EFFECT(nullptr, OnStop, OnTick, EffectInfo
.Id = "vehs_monster_trucks",
.IsTimed = true
}
-);
\ No newline at end of file
+);