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 );
        }
    }
}
Exemple #2
0
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 );
    }
}
Exemple #3
0
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;
        }
    }
}
Exemple #4
0
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 {
Exemple #5
0
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 {
Exemple #6
0
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;
}
Exemple #7
0
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
        }
    }
Exemple #9
0
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;
}
Exemple #10
0
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;
}