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 +);