void SwitchContext ( CVehicle* pVehicle ) { if ( !pVehicle ) return; // Grab the vehicle's internal interface CVehicleSA* pVehicleSA = dynamic_cast < CVehicleSA* > ( pVehicle ); DWORD dwVehicle = (DWORD)pVehicleSA->GetInterface (); // Grab the driver of the vehicle CPed* thePed = pVehicle->GetDriver (); if ( thePed ) { // Switch the context to the driver of the vehiclee SwitchContext ( thePed ); if ( bNotInLocalContext ) { // Prevent the game making remote players vehicle's audio behave like locals (and deleting // radio etc when they are removed) - issue #95 MemPutFast < BYTE > ( 0x50230C, 0x0 ); MemPutFast < BYTE > ( dwVehicle + 312 + 0xA5, 0 ); // For tanks, to prevent our mouse movement affecting remote tanks // 006AEA25 0F85 60010000 JNZ gta_sa.006AEB8B // V // 006AEA25 90 NOP // 006AEA26 E9 60010000 JMP gta_sa.006AEB8B MemPutFast < BYTE > ( 0x6AEA25, 0x90 ); MemPutFast < BYTE > ( 0x6AEA26, 0xE9 ); // Same for firetrucks and SWATs // 00729B96 0F85 75010000 JNZ gta_sa.00729D11 // V // 00729B96 90 NOP // 00729B97 E9 75010000 JMP gta_sa.00729D11 MemPutFast < BYTE > ( 0x729B96, 0x90 ); MemPutFast < BYTE > ( 0x729B97, 0xE9 ); bRadioHackInstalled = TRUE; } else { //0050237C |. E8 9F37FFFF CALL gta_sa_u.004F5B20 MemPutFast < BYTE > ( 0x50237C + 0, 0xE8 ); MemPutFast < BYTE > ( 0x50237C + 1, 0x9F ); MemPutFast < BYTE > ( 0x50237C + 2, 0x37 ); MemPutFast < BYTE > ( 0x50237C + 3, 0xFF ); MemPutFast < BYTE > ( 0x50237C + 4, 0xFF ); //0x5023A3 MemPutFast < BYTE > ( 0x5023A3 + 0, 0xE8 ); MemPutFast < BYTE > ( 0x5023A3 + 1, 0xB8 ); MemPutFast < BYTE > ( 0x5023A3 + 2, 0x37 ); MemPutFast < BYTE > ( 0x5023A3 + 3, 0xFF ); MemPutFast < BYTE > ( 0x5023A3 + 4, 0xFF ); } } }
void CPoolsSA::RemoveVehicle ( CVehicle* pVehicle, bool bDelete ) { DEBUG_TRACE("void CPoolsSA::RemoveVehicle ( CVehicle * pVehicle, bool bDelete )"); assert ( NULL != pVehicle ); CVehicleSA* pVehicleSA = dynamic_cast < CVehicleSA* > ( pVehicle ); if ( pVehicleSA ) { RemoveVehicle ( pVehicleSA->GetArrayID (), bDelete ); } }
void SwitchContext ( CVehicle* pVehicle ) { if ( !pVehicle ) return; // Grab the vehicle's internal interface CVehicleSA* pVehicleSA = dynamic_cast < CVehicleSA* > ( pVehicle ); DWORD dwVehicle = (DWORD)pVehicleSA->GetInterface (); // Grab the driver of the vehicle CPed* thePed = pVehicle->GetDriver (); if ( thePed ) { // Switch the context to the driver of the vehiclee SwitchContext ( thePed ); if ( bNotInLocalContext ) { // Prevent the game making remote players vehicle's audio behave like locals (and deleting // radio etc when they are removed) - issue #95 *(BYTE *)0x50230C = 0x0; *(BYTE *)(dwVehicle + 312 + 0xA5) = 0; // set the is local player's flag to 0 on the audio entity for the vehicle // For tanks, to prevent our mouse movement affecting remote tanks // 006AEA25 0F85 60010000 JNZ gta_sa.006AEB8B // V // 006AEA25 90 NOP // 006AEA26 E9 60010000 JMP gta_sa.006AEB8B *(BYTE *)0x6AEA25 = 0x90; *(BYTE *)0x6AEA26 = 0xE9; bRadioHackInstalled = TRUE; } else { //0050237C |. E8 9F37FFFF CALL gta_sa_u.004F5B20 *(BYTE *)(0x50237C + 0) = 0xE8; *(BYTE *)(0x50237C + 1) = 0x9F; *(BYTE *)(0x50237C + 2) = 0x37; *(BYTE *)(0x50237C + 3) = 0xFF; *(BYTE *)(0x50237C + 4) = 0xFF; //0x5023A3 *(BYTE *)(0x5023A3 + 0) = 0xE8; *(BYTE *)(0x5023A3 + 1) = 0xB8; *(BYTE *)(0x5023A3 + 2) = 0x37; *(BYTE *)(0x5023A3 + 3) = 0xFF; *(BYTE *)(0x5023A3 + 4) = 0xFF; } } }
CTaskSimpleCarSetPedInAsDriverSA::CTaskSimpleCarSetPedInAsDriverSA(CVehicle* pTargetVehicle, CTaskUtilityLineUpPedWithCar* pUtility) { DEBUG_TRACE("CTaskSimpleCarSetPedInAsDriverSA::CTaskSimpleCarSetPedInAsDriverSA(CVehicle* pTargetVehicle, CTaskUtilityLineUpPedWithCar* pUtility)"); CVehicleSA* pTargetVehicleSA = dynamic_cast < CVehicleSA* > ( pTargetVehicle ); if ( pTargetVehicleSA ) { this->CreateTaskInterface(sizeof(CTaskSimpleCarSetPedInAsDriverSAInterface)); DWORD dwFunc = FUNC_CTaskSimpleCarSetPedInAsDriver__Constructor; DWORD dwVehiclePtr = (DWORD)pTargetVehicleSA->GetInterface(); DWORD dwThisInterface = (DWORD)this->GetInterface(); _asm { mov ecx, dwThisInterface push pUtility push dwVehiclePtr call dwFunc } } else {
CTaskComplexEnterCarAsDriverSA::CTaskComplexEnterCarAsDriverSA ( CVehicle* pTargetVehicle):CTaskComplexEnterCarSA ( pTargetVehicle, true, false, false, false ) { DEBUG_TRACE("CTaskComplexEnterCarAsDriverSA::CTaskComplexEnterCarAsDriverSA(CVehicle* pTargetVehicle)"); CVehicleSA* pTargetVehicleSA = dynamic_cast < CVehicleSA* > ( pTargetVehicle ); if ( pTargetVehicleSA ) { this->CreateTaskInterface(sizeof(CTaskComplexEnterCarAsDriverSAInterface)); if ( !IsValid () ) return; DWORD dwFunc = FUNC_CTaskComplexEnterCarAsDriver__Constructor; DWORD dwVehiclePtr = (DWORD)pTargetVehicleSA->GetInterface(); DWORD dwThisInterface = (DWORD)this->GetInterface(); _asm { mov ecx, dwThisInterface push dwVehiclePtr call dwFunc } } else {
DWORD CPoolsSA::GetVehicleRef ( CVehicle* pVehicle ) { DEBUG_TRACE("DWORD CPoolsSA::GetVehicleRef ( CVehicle* pVehicle )"); DWORD dwRef = 0; CVehicleSA* pVehicleSA = dynamic_cast < CVehicleSA * > ( pVehicle ); if ( pVehicleSA ) { CVehicleSAInterface* pInterface = pVehicleSA->GetVehicleInterface (); DWORD dwFunc = FUNC_GetVehicleRef; _asm { push pInterface call dwFunc add esp, 0x4 mov dwRef, eax } } return dwRef; }
void CPoolsSA::RemoveVehicle ( unsigned long ulID, bool ) { DEBUG_TRACE("void CPoolsSA::RemoveVehicle ( unsigned long ulID, bool )"); static bool bIsDeletingVehicleAlready = false; // to prevent delete being called twice if ( !bIsDeletingVehicleAlready ) { bIsDeletingVehicleAlready = true; CVehicleSA* pVehicleSA = m_vehiclePool.array [ ulID ]; assert ( NULL != pVehicleSA ); // Pop the element to remove from the pool array if ( ulID != m_vehiclePool.ulCount - 1 ) { // We are removing an intermediate position of // the array. Move the last element to the just // deleted element position to not allow empty // spaces on it. m_vehiclePool.array [ ulID ] = m_vehiclePool.array [ m_vehiclePool.ulCount - 1 ]; m_vehiclePool.array [ ulID ]->SetArrayID ( ulID ); } m_vehiclePool.array [ m_vehiclePool.ulCount - 1 ] = NULL; // Unlink the element to remove from the pool map vehiclePool_t::mapType::iterator iter = m_vehiclePool.map.find ( pVehicleSA->GetVehicleInterface () ); if ( iter != m_vehiclePool.map.end () ) { m_vehiclePool.map.erase ( iter ); } // Delete it from memory delete pVehicleSA; // Decrease the count of elements in the pool --m_vehiclePool.ulCount; bIsDeletingVehicleAlready = false; } }
bool CCarEnterExitSA::GetNearestCarDoor ( CPed * pPed, CVehicle * pVehicle, CVector * pVector, int * pDoor ) { DWORD dwFunc = FUNC_GetNearestCarDoor; bool bReturn = false; CPedSA* pPedSA = dynamic_cast < CPedSA* > ( pPed ); CVehicleSA* pVehicleSA = dynamic_cast < CVehicleSA* > ( pVehicle ); if ( pPedSA && pVehicleSA ) { CPedSAInterface * pPedInterface = pPedSA->GetPedInterface (); CVehicleSAInterface * pVehicleInterface = pVehicleSA->GetVehicleInterface (); _asm { push pDoor push pVector push pVehicleInterface push pPedInterface call dwFunc add esp, 0x10 mov bReturn, al } }
CVehicle* CPoolsSA::AddTrain ( CVector * vecPosition, DWORD dwModels[], int iSize, bool bDirection ) { DEBUG_TRACE("CVehicle* CPoolsSA::AddTrain ( CVector * vecPosition, DWORD dwModels[], int iSize, bool bDirection )"); // clean the existing array memset ( (void *)VAR_TrainModelArray, 0, 32 * sizeof(DWORD) ); // now load the models we're going to use and add them to the array for ( int i = 0; i < iSize; i++ ) { if ( dwModels[i] == 449 || dwModels[i] == 537 || dwModels[i] == 538 || dwModels[i] == 569 || dwModels[i] == 590 ) { *(DWORD *)(VAR_TrainModelArray + i * 4) = dwModels[i]; } } CVehicleSAInterface * trainBegining; CVehicleSAInterface * trainEnd; float fX = vecPosition->fX; float fY = vecPosition->fY; float fZ = vecPosition->fZ; // Disable GetVehicle because CreateMissionTrain calls it before our CVehicleSA instance is inited m_bGetVehicleEnabled = false; DWORD dwFunc = FUNC_CTrain_CreateMissionTrain; _asm { push 0 // place as close to point as possible (rather than at node)? (maybe) (actually seems to have an effect on the speed, so changed from 1 to 0) push 0 // start finding closest from here push -1 // node to start at (-1 for closest node) lea ecx, trainEnd push ecx // end of train lea ecx, trainBegining push ecx // begining of train push 0 // train type (always use 0 as thats where we're writing to) push bDirection // direction push fZ // z push fY // y push fX // x call dwFunc add esp, 0x28 } // Enable GetVehicle m_bGetVehicleEnabled = true; CVehicleSA * trainHead = NULL; if ( trainBegining ) { DWORD vehicleIndex = 0; if ( m_vehiclePool.ulCount < MAX_VEHICLES ) { trainHead = new CVehicleSA ( trainBegining ); if ( ! AddVehicleToPool ( trainHead ) ) { delete trainHead; trainHead = NULL; } else ++vehicleIndex; } CVehicleSA * carriage = trainHead; while ( carriage ) { if ( m_vehiclePool.ulCount < MAX_VEHICLES) { CVehicleSAInterface* vehCarriage = carriage->GetNextCarriageInTrain (); if ( vehCarriage ) { carriage = new CVehicleSA ( vehCarriage ); if ( ! AddVehicleToPool ( carriage ) ) { delete carriage; carriage = NULL; } else ++vehicleIndex; } else carriage = NULL; } } } // Stops the train from moving at ludacrist speeds right after creation // due to some glitch in the node finding in CreateMissionTrain trainHead->SetMoveSpeed ( &CVector ( 0, 0, 0 ) ); return trainHead; }
void cheat_lockstatus() { if (!cheat_state->_generic.lockstatus) return; if (gta_menu_active()) return; if (cheat_state->_generic.cheat_panic_enabled) return; if (!pGameInterface || !pGameInterface->GetPools()) return; if (!pPedSelf) return; const vehicle_entry *vehicle; char buf[256]; int v; float w, h; D3DXVECTOR3 poss, screenposs; CVector2D screenPosition; CVector ourPosition, iterPosition, ourPosMinusIter; // get our position if (!isBadPtr_GTA_pVehicle(pPedSelf->GetVehicle())) { ourPosition = *(pPedSelf->GetVehicle()->GetPosition()); } else { ourPosition = pPedSelf->GetInterface()->Placeable.matrix->vPos; } // setup iterator CVehicleSA *iterVehicle = NULL; CPoolsSA *pPools = reinterpret_cast <CPoolsSA *> (pGameInterface->GetPools()); CPoolsSA::vehiclePool_t::mapType::iterator iter = pPools->m_vehiclePool.map.begin(); // iterate while (iter.pos < iter.end) { // map iterator CVehicleSA pointer to our CVehicleSA pointer iterVehicle = iter.pos->second; // advance to next CVehicleSA for next pass iter.pos++; // move past null pointers if (isBadPtr_GTA_pVehicle(iterVehicle)) continue; //if ( isBadPtr_GTA_pVehicle(iterVehicle->GetVehicleInterface()) ) // continue; // check if it's farther than set.vehicle_tags_dist iterPosition = iterVehicle->GetInterface()->Placeable.matrix->vPos; ourPosMinusIter = ourPosition - iterPosition; if (ourPosMinusIter.Length() > set.vehicle_tags_dist) continue; // check if it's our vehicle if (iterVehicle == pPedSelf->GetVehicle()) continue; // check if it's near zero if (iterVehicle->GetPosition()->IsNearZero()) continue; // CVector to D3DXVECTOR3, function to be converted to CVector later poss.x = iterPosition.fX; poss.y = iterPosition.fY; poss.z = iterPosition.fZ; // yup CalcScreenCoors(&poss, &screenposs); // check if the vehicle is culled or not if (screenposs.z < 1.f) continue; // D3DXVECTOR3 to CVector2D screenPosition.fX = screenposs.x; screenPosition.fY = screenposs.y; // get the vehicle model's name vehicle = gta_vehicle_get_by_id(iterVehicle->GetModelIndex()); // get SAMP's vehicle id if (g_Vehicles != NULL) v = translateGTASAMP_vehiclePool.iSAMPID[getVehicleGTAIDFromInterface((DWORD *)iterVehicle->GetVehicleInterface())]; else v = (int)iterVehicle->GetArrayID(); ///////////////// // render time // h = pD3DFont->DrawHeight(); _snprintf_s(buf, sizeof(buf)-1, "%s", iterVehicle->AreDoorsLocked() ? "Закрыта" : "Открыта"); w = pD3DFont->DrawLength(buf); // different color if car is being driven DWORD color_veh; if (iterVehicle->AreDoorsLocked()) color_veh = D3DCOLOR_XRGB(255, 0, 0); // blueish 100, 150, 235 else color_veh = D3DCOLOR_XRGB(0, 255, 0); // render vehicle name pD3DFont->PrintShadow(screenPosition.fX, screenPosition.fY, color_veh, buf); } return; }