void CClientWeapon::GetDirection ( CVector & vecDirection )
{
    CVector vecRotation;
    GetRotationRadians ( vecRotation );

    vecDirection = CVector ( 1, 0, 0 );
    RotateVector ( vecDirection, vecRotation );
}
void CClientWeapon::SetDirection ( CVector & vecDirection )
{
    CVector vecRotation;
    GetRotationRadians ( vecRotation );

    vecRotation.fZ = atan2 ( vecDirection.fY, vecDirection.fX );
    CVector2D vecTemp ( vecDirection.fX, vecDirection.fY );
    float length = vecTemp.Length ();
    vecTemp = CVector2D ( length, vecDirection.fZ );
    vecTemp.Normalize ();
    vecRotation.fY = atan2 ( vecTemp.fX, vecTemp.fY )/* - ConvertDegreesToRadians ( 90 )*/;
    
    SetRotationRadians ( vecRotation );
}
Example #3
0
void CClientObject::SetPosition ( const CVector& vecPosition )
{   
    // Move the object
    if ( m_pObject )
    {
        CVector vecRot;
        GetRotationRadians ( vecRot );
        m_pObject->Teleport ( vecPosition.fX, vecPosition.fY, vecPosition.fZ );
#ifndef MTA_BUILDINGS
        m_pObject->ProcessCollision ();
#endif
        m_pObject->SetupLighting ();
        SetRotationRadians ( vecRot );
    }

    if ( m_vecPosition != vecPosition )
    {
        // Store the position in our datastruct
        m_vecPosition = vecPosition;

        // Update our streaming position
        UpdateStreamPosition ( vecPosition );
    }
}
Example #4
0
bool CPlayer::HandleEvent( UINT eventId, void* data, UINT data_sz )
{
	static const EMovementFlagType movementMap[] = {
		MOVE_FORWARD_FLAG,
		MOVE_BACKWARD_FLAG,
		MOVE_LEFT_FLAG,
		MOVE_RIGHT_FLAG,
		};

	switch( eventId )
	{
	case EVT_UPDATE:
		assert( data_sz == sizeof(float) );
		assert( data != NULL );
		Update( *(float*)data );
		break;
	case EVT_INIT:
		assert( data_sz == sizeof(CMeshManager*) );
		assert( data != NULL );
		Setup( *reinterpret_cast<CMeshManager*>(data) );
		break;
	case EVT_GETFACINGVEC:
		{
		assert( data_sz == sizeof(GetFacingEventArgType) );
		assert( data != NULL );
		*(GetFacingEventArgType*)data = GetRotationRadians();
		break;
		}
	case EVT_SETFACINGVEC:
		{
		assert( data_sz == sizeof(SetFacingEventArgType) );
		assert( data != NULL );
		SetFacingEventArgType* arg = (SetFacingEventArgType*)data;
//		SetXRotationRadians(arg->x);
		SetYRotationRadians(arg->y);
//		SetZRotationRadians(arg->z);
		break;
		}
	case EVT_MOVECMD:
		{
		assert( data_sz == sizeof(MovementCommandType) );
		assert( data != NULL );
		MovementCommandType* args = (MovementCommandType*)data;
		if(args->clearFlag)
			m_movementState &= ~movementMap[args->state];
		else
			m_movementState |= movementMap[args->state];
		break;
		}
	case EVT_GETPOSITIONVEC:
		assert( data_sz == sizeof(GetPosEventArgType) );
		assert( data != NULL );
		*(GetPosEventArgType*)data = GetPosition3D();
		break;
	case EVT_CONTROL_LOST_FOCUS:
	case EVT_CONTROL_GAIN_FOCUS:
		m_movementState &= ~MOVE_FLAG_MASK;
		break;
	case EVT_ATTACH_CAMERA:
		assert( data_sz == sizeof(CCamera*) );
		assert( data != NULL );
		reinterpret_cast<CCamera*>(data)->SetLocalPosition(Vector_3(-5.0f, 12.0f, -20.0f));
		break;
	default:
		assert(false);
		break;
	}

	return true;
}
Example #5
0
void CClientObject::GetOrientation ( CVector& vecPosition, CVector& vecRotationRadians )
{
    GetPosition ( vecPosition );
    GetRotationRadians ( vecRotationRadians );
}
Example #6
0
void CClientObject::GetRotationDegrees ( CVector& vecRotation ) const
{
    GetRotationRadians ( vecRotation );
    ConvertRadiansToDegrees ( vecRotation );
}
Example #7
0
void CClientWeapon::Fire ( void )
{       

    if ( !m_pWeapon || !m_pObject ) return;
    switch ( m_Type )
    {
        case WEAPONTYPE_PISTOL:
        case WEAPONTYPE_PISTOL_SILENCED:
        case WEAPONTYPE_DESERT_EAGLE:
#ifdef SHOTGUN_TEST
        case WEAPONTYPE_SHOTGUN: 
        case WEAPONTYPE_SAWNOFF_SHOTGUN:
        case WEAPONTYPE_SPAS12_SHOTGUN:
#endif
        case WEAPONTYPE_MICRO_UZI:
        case WEAPONTYPE_MP5:
        case WEAPONTYPE_AK47:
        case WEAPONTYPE_M4:
        case WEAPONTYPE_TEC9:
        case WEAPONTYPE_COUNTRYRIFLE:
        case WEAPONTYPE_SNIPERRIFLE:
        case WEAPONTYPE_MINIGUN:
        {
            CVector vecOrigin, vecRotation;
            GetPosition ( vecOrigin );

            if ( m_pAttachedToEntity )
            {

                GetRotationRadians ( vecRotation );

            }
            else
            {
                GetRotationRadians ( vecRotation );

                vecRotation = -vecRotation;
            }
            CVector vecTarget;
            float fDistance = m_pWeaponInfo->GetWeaponRange ();
            if ( m_targetType == TARGET_TYPE_ENTITY )
            {
                if ( m_pTarget )
                {
                    if ( m_pTarget->GetType ( ) == CCLIENTPED || m_pTarget->GetType ( ) == CCLIENTPLAYER )
                    {
                        CClientPed * pPed = (CClientPed *) (CClientEntity *) m_pTarget;
                        pPed->GetBonePosition( m_targetBone, vecTarget );
                    }
                    else
                    {
                        if ( m_pTarget->GetType() == CCLIENTVEHICLE )
                        {
                            if ( m_itargetWheel <= MAX_WHEELS )
                            {
                                CClientVehicle * pTarget = (CClientVehicle*)(CClientEntity *)m_pTarget;
                                vecTarget = pTarget->GetGameVehicle()->GetWheelPosition ( (eWheels)m_itargetWheel );
                            }
                            else
                                m_pTarget->GetPosition( vecTarget );
                        }
                        else
                            m_pTarget->GetPosition( vecTarget );
                    }
                    if ( m_weaponConfig.bShootIfTargetOutOfRange == false && (vecOrigin - vecTarget).Length() >= fDistance )
                    {
                        return;
                    }
                }
                else
                {
                    ResetWeaponTarget ( );
                }
            }
            else if ( m_targetType == TARGET_TYPE_VECTOR )
            {
                vecTarget = m_vecTarget;
                if ( m_weaponConfig.bShootIfTargetOutOfRange == false && (vecOrigin - vecTarget).Length() >= fDistance )
                {
                    return;
                }
            }
            else
            {
                CVector vecFireOffset = *m_pWeaponInfo->GetFireOffset ();
                RotateVector ( vecFireOffset, vecRotation );
#ifndef SHOTGUN_TEST
                vecOrigin += vecFireOffset;
#endif
                CVector vecDirection ( 1, 0, 0 );
                vecDirection *= fDistance;
                RotateVector ( vecDirection, vecRotation );
                vecTarget = vecOrigin + vecDirection;
            }


            // Save
            short sDamage = m_pWeaponInfo->GetDamagePerHit ( );
            float fAccuracy = m_pWeaponInfo->GetAccuracy ( );
            float fTargetRange = m_pWeaponInfo->GetTargetRange ( );
            float fRange = m_pWeaponInfo->GetWeaponRange ( );

            // Set new
            m_pWeaponInfo->SetDamagePerHit ( m_pWeaponStat->GetDamagePerHit ( ) );
            m_pWeaponInfo->SetAccuracy ( m_pWeaponStat->GetAccuracy ( ) );
            m_pWeaponInfo->SetTargetRange ( m_pWeaponStat->GetTargetRange ( ) );
            m_pWeaponInfo->SetWeaponRange ( m_pWeaponStat->GetWeaponRange ( ) );

            // Begin our lag compensation
            CPlayerPed* pOwnerPed = NULL;
            if ( m_pOwner && !m_pTarget && g_pClientGame->GetPlayerManager()->Exists(m_pOwner) ) // No need for compensation if we're hitting a target directly
            {
                pOwnerPed = m_pOwner->GetGamePlayer();
                //if ( g_pGame->m_pPreWeaponFireHandler && pOwnerPed )
                    //g_pGame->m_pPreWeaponFireHandler ( pOwnerPed, false );
            }
#ifdef SHOTGUN_TEST
            CVector vecTemp;
            CVector vecFireOffset = *m_pWeaponInfo->GetFireOffset ();
            RotateVector ( vecFireOffset, vecRotation );
            vecTemp = vecFireOffset;
            vecTemp += vecOrigin;
#ifdef MARKER_DEBUG
            // Process
            m_pMarker->SetPosition ( vecOrigin );
#endif
            CVector vecTemp2;
            GetRotationDegrees(vecTemp2);
            vecTemp2.fZ -= 84.6f;
            SetRotationDegrees(vecTemp2);
            FireInstantHit ( vecOrigin, vecTarget-vecOrigin, vecTemp );
            vecTemp2.fZ += 84.6f;
            SetRotationDegrees(vecTemp2);
#else
            FireInstantHit ( vecOrigin, vecTarget );
#endif
            // Restore
            m_pWeaponInfo->SetDamagePerHit ( sDamage );
            m_pWeaponInfo->SetAccuracy ( fAccuracy );
            m_pWeaponInfo->SetTargetRange ( fTargetRange );
            m_pWeaponInfo->SetWeaponRange ( fRange );

            // End our lag compensation
            //if ( g_pGame->m_pPostWeaponFireHandler && pOwnerPed )
                //g_pGame->m_pPostWeaponFireHandler ();

            m_nAmmoInClip--;
            m_fireTimer.Reset();
            break;
        }
        default: break;
    }
}