From 03482f07794fed5c1940611a3188269be82f96f6 Mon Sep 17 00:00:00 2001 From: Silent Date: Tue, 5 Jun 2018 20:01:45 +0200 Subject: [PATCH] Allow for several hierarchy typos (DFT-30, Sweeper, boats) This retires BOAT_MOVING_PROP feature and Sweeper workaround --- SilentPatchSA/SilentPatchSA.cpp | 34 ++++++++++++++++++++++++++------- SilentPatchSA/VehicleSA.cpp | 31 ++---------------------------- SilentPatchSA/VehicleSA.h | 5 ----- 3 files changed, 29 insertions(+), 41 deletions(-) diff --git a/SilentPatchSA/SilentPatchSA.cpp b/SilentPatchSA/SilentPatchSA.cpp index e8227a0..d17a7ac 100644 --- a/SilentPatchSA/SilentPatchSA.cpp +++ b/SilentPatchSA/SilentPatchSA.cpp @@ -1488,6 +1488,27 @@ TestFirelaAndFlags_UpdateMovingCollision: } } +namespace HierarchyTypoFix +{ + // Allow wheel_lm vs wheel_lm_dummy and miscX vs misc_X typos + constexpr std::pair typosAndFixes[] = { + { "wheel_lm_dummy", "wheel_lm" }, + { "misc_a", "misca" }, + { "misc_b", "miscb" }, + { "boat_moving_hi", "boat_moving" }, + }; + int strcasecmp( const char* dataName, const char* nodeName ) + { + for ( const auto& typo : typosAndFixes ) + { + if ( _stricmp( dataName, typo.first ) == 0 && _stricmp( nodeName, typo.second ) == 0 ) return 0; + } + + return _stricmp( dataName, nodeName ); + } + +} + #ifndef NDEBUG @@ -3564,7 +3585,7 @@ void Patch_SA_10() // Animated Phoenix hood scoop - auto* automobilePreRender = &(*(decltype(CAutomobile::orgAutomobilePreRender)**)(0x6B0AD2 + 2))[17]; + auto* automobilePreRender = (*(decltype(CAutomobile::orgAutomobilePreRender)**)(0x6B0AD2 + 2)) + 17; CAutomobile::orgAutomobilePreRender = *automobilePreRender; Patch(automobilePreRender, &CAutomobile::PreRender_Stub); @@ -3574,16 +3595,11 @@ void Patch_SA_10() // Extra animations for planes - auto* planePreRender = &(*(decltype(CPlane::orgPlanePreRender)**)(0x6C8E5A + 2))[17]; + auto* planePreRender = (*(decltype(CPlane::orgPlanePreRender)**)(0x6C8E5A + 2)) + 17; CPlane::orgPlanePreRender = *planePreRender; Patch(planePreRender, &CPlane::PreRender_Stub); - // Fixed animations for boats - ReadCall( 0x6F119E, CVehicle::orgVehiclePreRender ); - InjectHook( 0x6F119E, &CBoat::PreRender_SilentPatch ); - - // Stop BF Injection/Bandito/Hotknife rotating engine components when engine is off Patch(0x6AC2BE + 2, &CAutomobile::ms_engineCompSpeed); Patch(0x6ACB91 + 2, &CAutomobile::ms_engineCompSpeed); @@ -3733,6 +3749,10 @@ void Patch_SA_10() CTrailer::orgGetTowBarPos = *trailerTowBarPos; Patch(trailerTowBarPos, &CTrailer::GetTowBarPos_Stub); } + + + // DFT-30 wheel, Sweeper brushes and other typos in hierarchy + InjectHook( 0x4C5311, HierarchyTypoFix::strcasecmp ); } void Patch_SA_11() diff --git a/SilentPatchSA/VehicleSA.cpp b/SilentPatchSA/VehicleSA.cpp index b04635c..1066a91 100644 --- a/SilentPatchSA/VehicleSA.cpp +++ b/SilentPatchSA/VehicleSA.cpp @@ -27,7 +27,6 @@ namespace SVF { PHOENIX_FLUTTER, SWEEPER_BRUSHES, NEWSVAN_DISH, - BOAT_MOVING_PROP, EXTRA_AILERONS1, // Like on Beagle EXTRA_AILERONS2, // Like on Stuntplane DOUBLE_TRAILER, // Like on artict3 @@ -50,7 +49,6 @@ namespace SVF { { "PHOENIX_FLUTTER", Feature::PHOENIX_FLUTTER }, { "SWEEPER_BRUSHES", Feature::SWEEPER_BRUSHES }, { "NEWSVAN_DISH", Feature::NEWSVAN_DISH }, - { "BOAT_MOVING_PROP", Feature::BOAT_MOVING_PROP }, { "EXTRA_AILERONS1", Feature::EXTRA_AILERONS1 }, { "EXTRA_AILERONS2", Feature::EXTRA_AILERONS2 }, { "DOUBLE_TRAILER", Feature::DOUBLE_TRAILER }, @@ -87,10 +85,7 @@ namespace SVF { } static std::multimap > specialVehFeatures = { - _registerFeatureInternal( 430, Feature::BOAT_MOVING_PROP ), _registerFeatureInternal( 432, Feature::RHINO_WHEELS ), - _registerFeatureInternal( 453, Feature::BOAT_MOVING_PROP ), - _registerFeatureInternal( 454, Feature::BOAT_MOVING_PROP ), _registerFeatureInternal( 511, Feature::EXTRA_AILERONS1 ), _registerFeatureInternal( 513, Feature::EXTRA_AILERONS2 ), _registerFeatureInternal( 525, Feature::TOWTRUCK_HOOK ), @@ -163,7 +158,6 @@ WRAPPER bool CVehicle::IsLawEnforcementVehicle() { VARJMP(varIsLawEnforcementVeh auto GetFrameHierarchyId = AddressByVersion(0x732A20, 0x733250, 0x76CC30); -void (CVehicle::*CVehicle::orgVehiclePreRender)(); void (CAutomobile::*CAutomobile::orgAutomobilePreRender)(); void (CPlane::*CPlane::orgPlanePreRender)(); CVehicle* (CStoredCar::*CStoredCar::orgRestoreCar)(); @@ -187,7 +181,7 @@ static RwObject* GetCurrentAtomicObject( RwFrame* frame ) return obj; } -static RwFrame* GetFrameFromName( RwFrame* topFrame, const char* name ) +RwFrame* GetFrameFromName( RwFrame* topFrame, const char* name ) { class GetFramePredicate { @@ -217,7 +211,7 @@ static RwFrame* GetFrameFromName( RwFrame* topFrame, const char* name ) return RwFrameForAllChildren( topFrame, GetFramePredicate(name) ).foundFrame; } -static RwFrame* GetFrameFromID( RwFrame* topFrame, int32_t ID ) +RwFrame* GetFrameFromID( RwFrame* topFrame, int32_t ID ) { class GetFramePredicate { @@ -486,18 +480,6 @@ void CPlane::PreRender() } } -void CBoat::PreRender_SilentPatch() -{ - (this->*(orgVehiclePreRender))(); - - // Fixed moving prop for Predator/Tropic/Reefer - const int32_t extID = m_nModelIndex.Get(); - if ( m_pBoatNode[1] == nullptr && SVF::ModelHasFeature( extID, SVF::Feature::BOAT_MOVING_PROP ) ) - { - m_pBoatNode[1] = GetFrameFromName( RpClumpGetFrame(m_pRwObject), "boat_moving" ); - } -} - void CAutomobile::PreRender() { // For rotating engine components @@ -623,15 +605,6 @@ void CAutomobile::ProcessSweeper() if ( GetStatus() == STATUS_PLAYER || GetStatus() == STATUS_PHYSICS || GetStatus() == STATUS_SIMPLE ) { - if ( m_pCarNode[20] == nullptr ) - { - m_pCarNode[20] = GetFrameFromName( RpClumpGetFrame(m_pRwObject), "misca" ); - } - if ( m_pCarNode[21] == nullptr ) - { - m_pCarNode[21] = GetFrameFromName( RpClumpGetFrame(m_pRwObject), "miscb" ); - } - const float angle = CTimer::m_fTimeStep * SWEEPER_BRUSH_SPEED; SetComponentRotation( m_pCarNode[20], ROT_AXIS_Z, angle, false ); diff --git a/SilentPatchSA/VehicleSA.h b/SilentPatchSA/VehicleSA.h index 2e778ea..e870b23 100644 --- a/SilentPatchSA/VehicleSA.h +++ b/SilentPatchSA/VehicleSA.h @@ -266,8 +266,6 @@ public: static void SetComponentRotation( RwFrame* component, eRotAxis axis, float angle, bool absolute = true ); static void SetComponentAtomicAlpha(RpAtomic* pAtomic, int nAlpha); - - static void (CVehicle::*orgVehiclePreRender)(); }; class NOVMT CAutomobile : public CVehicle @@ -359,9 +357,6 @@ class NOVMT CBoat : public CVehicle { uint8_t __pad[16]; RwFrame* m_pBoatNode[12]; - -public: - void PreRender_SilentPatch(); }; class CStoredCar