@@ -1502,13 +1502,13 @@ void CVehicleSA::SetGravity(const CVector* pvecGravity)
15021502 m_vecGravity = *pvecGravity;
15031503}
15041504
1505- bool CVehicleSA::SpawnFlyingComponent (eCarNodes nodeIndex, eCarComponentCollisionTypes collisionType, std::int32_t removalTime)
1505+ bool CVehicleSA::SpawnFlyingComponent (const eCarNodes& nodeIndex, const eCarComponentCollisionTypes& collisionType, std::int32_t removalTime)
15061506{
1507- if (nodeIndex < 1 )
1507+ if (nodeIndex == eCarNodes::NONE )
15081508 return false ;
15091509
15101510 DWORD nodesOffset = OFFSET_CAutomobile_Nodes;
1511- RwFrame* defaultBikeChassisFrame;
1511+ RwFrame* defaultBikeChassisFrame = nullptr ;
15121512
15131513 // CBike, CBmx, CBoat and CTrain don't inherit CAutomobile so let's do it manually!
15141514 switch (static_cast <VehicleClass>(GetVehicleInterface ()->m_vehicleClass ))
@@ -1525,11 +1525,7 @@ bool CVehicleSA::SpawnFlyingComponent(eCarNodes nodeIndex, eCarComponentCollisio
15251525 }
15261526 case VehicleClass::TRAIN:
15271527 {
1528- auto * trainInterface = static_cast <CTrainSAInterface*>(GetVehicleInterface ());
1529- if (!trainInterface)
1530- return false ;
1531-
1532- if (nodeIndex >= sizeof (trainInterface->m_aTrainNodes ) / sizeof (RwFrame*))
1528+ if (static_cast <eTrainNodes>(nodeIndex) >= eTrainNodes::NUM_NODES)
15331529 return false ;
15341530
15351531 nodesOffset = OFFSET_CTrain_Nodes;
@@ -1542,30 +1538,26 @@ bool CVehicleSA::SpawnFlyingComponent(eCarNodes nodeIndex, eCarComponentCollisio
15421538 if (!bikeInterface)
15431539 return false ;
15441540
1545- if (nodeIndex >= sizeof (bikeInterface-> m_apModelNodes ) / sizeof (RwFrame*) )
1541+ if (static_cast <eBikeNodes>( nodeIndex) >= eBikeNodes::NUM_NODES )
15461542 return false ;
15471543
15481544 nodesOffset = OFFSET_CBike_Nodes;
1549- if (nodeIndex != 1 )
1545+ if (static_cast <eBikeNodes>( nodeIndex) != eBikeNodes::CHASSIS )
15501546 break ;
15511547
15521548 // Set the correct "bike_chassis" frame for bikes
15531549 defaultBikeChassisFrame = bikeInterface->m_apModelNodes [1 ];
15541550 if (defaultBikeChassisFrame && std::strcmp (defaultBikeChassisFrame->szName , " chassis_dummy" ) == 0 )
15551551 {
1556- RwFrame* correctChassisFrame = ((RwFrame * (__cdecl*)(RpClump*, const char *))FUNC_CClumpModelInfo_GetFrameFromName)( bikeInterface->m_pRwObject , " chassis" );
1552+ RwFrame* correctChassisFrame = RwFrameFindFrame ( RpGetFrame ( bikeInterface->m_pRwObject ) , " chassis" );
15571553 if (correctChassisFrame)
15581554 bikeInterface->m_apModelNodes [1 ] = correctChassisFrame;
15591555 }
15601556 break ;
15611557 }
15621558 case VehicleClass::BOAT:
15631559 {
1564- auto * boatInterface = static_cast <CBoatSAInterface*>(GetVehicleInterface ());
1565- if (!boatInterface)
1566- return false ;
1567-
1568- if (nodeIndex >= sizeof (boatInterface->pBoatParts ) / sizeof (RwFrame*))
1560+ if (static_cast <eBoatNodes>(nodeIndex) >= eBoatNodes::NUM_NODES)
15691561 return false ;
15701562
15711563 nodesOffset = OFFSET_CBoat_Nodes;
@@ -1579,24 +1571,15 @@ bool CVehicleSA::SpawnFlyingComponent(eCarNodes nodeIndex, eCarComponentCollisio
15791571 MemPut (0x6A85B3 , nodesOffset);
15801572 MemPut (0x6A8631 , nodesOffset);
15811573
1582- DWORD dwInterface = (DWORD)GetInterface ();
1583- DWORD dwFunc = FUNC_CAutomobile__SpawnFlyingComponent;
1584- DWORD dwReturn;
1585- _asm
1586- {
1587- mov ecx, dwInterface
1588- push collisionType
1589- push nodeIndex
1590- call dwFunc
1591- mov dwReturn, eax
1592- }
1574+ auto * componentObject = ((CObjectSAInterface * (__thiscall*)(CVehicleSAInterface*, int , int )) FUNC_CAutomobile__SpawnFlyingComponent)(GetVehicleInterface (), static_cast <int >(nodeIndex), static_cast <int >(collisionType));
15931575
15941576 // Restore default nodes array in CAutomobile::SpawnFlyingComponent
1577+ // CAutomobile::m_aCarNodes offset
15951578 MemPut (0x6A85B3 , 0x648 );
15961579 MemPut (0x6A8631 , 0x648 );
15971580
15981581 // Restore default chassis frame for bikes
1599- if (nodeIndex == 1 && defaultBikeChassisFrame)
1582+ if (static_cast <eBikeNodes>( nodeIndex) == eBikeNodes::CHASSIS && defaultBikeChassisFrame)
16001583 {
16011584 auto * bikeInterface = static_cast <CBikeSAInterface*>(GetVehicleInterface ());
16021585 if (bikeInterface && bikeInterface->m_apModelNodes )
@@ -1606,11 +1589,7 @@ bool CVehicleSA::SpawnFlyingComponent(eCarNodes nodeIndex, eCarComponentCollisio
16061589 if (removalTime <= -1 )
16071590 return true ;
16081591
1609- auto * componentObject = reinterpret_cast <CObjectSAInterface*>((DWORD*)dwReturn);
1610- if (!componentObject)
1611- return ;
1612-
1613- int CTimer_ms = *(int *)0xB7CB84 ; // CTimer::m_snTimeInMilliseconds
1592+ std::uint32_t CTimer_ms = *reinterpret_cast <std::uint32_t *>(VAR_CTimer_snTimeInMilliseconds);
16141593 componentObject->uiObjectRemovalTime = CTimer_ms + static_cast <std::uint32_t >(removalTime);
16151594
16161595 return true ;
@@ -1623,16 +1602,16 @@ void CVehicleSA::SetWheelVisibility(eWheelPosition wheel, bool bVisible)
16231602 switch (wheel)
16241603 {
16251604 case FRONT_LEFT_WHEEL:
1626- pFrame = vehicle->m_aCarNodes [CAR_NODE_WHEEL_LF ];
1605+ pFrame = vehicle->m_aCarNodes [static_cast <std:: size_t >(eCarNodes::WHEEL_LF) ];
16271606 break ;
16281607 case REAR_LEFT_WHEEL:
1629- pFrame = vehicle->m_aCarNodes [CAR_NODE_WHEEL_LB ];
1608+ pFrame = vehicle->m_aCarNodes [static_cast <std:: size_t >(eCarNodes::WHEEL_LB) ];
16301609 break ;
16311610 case FRONT_RIGHT_WHEEL:
1632- pFrame = vehicle->m_aCarNodes [CAR_NODE_WHEEL_RF ];
1611+ pFrame = vehicle->m_aCarNodes [static_cast <std:: size_t >(eCarNodes::WHEEL_RF) ];
16331612 break ;
16341613 case REAR_RIGHT_WHEEL:
1635- pFrame = vehicle->m_aCarNodes [CAR_NODE_WHEEL_RB ];
1614+ pFrame = vehicle->m_aCarNodes [static_cast <std:: size_t >(eCarNodes::WHEEL_RB) ];
16361615 break ;
16371616 default :
16381617 break ;
0 commit comments