void CombatSubsystem::AimWeaponTag(const Vector& targetPos)
{
  Vector aimAngles;
  Vector gunPos, gunForward, gunRight, gunUp;

  //currentEnemy = act->enemyManager->GetCurrentEnemy();

  if (!_activeWeapon.weapon)
    return;

  _activeWeapon.weapon->setOrigin();
  _activeWeapon.weapon->setAngles();

  _activeWeapon.weapon->SetControllerAngles(WEAPONBONE_BARREL_TAG, vec_zero);

  GetGunPositionData(&gunPos, &gunForward, &gunRight, &gunUp);

  Vector mypos, myforward, myleft, myup;
  _activeWeapon.weapon->GetTag(WEAPONBONE_BARREL_TAG, &mypos, &myforward, &myleft, &myup);

  float gfToWorld[ 3 ][ 3 ];
  float worldToGf[ 3 ][ 3 ];
  gunForward.copyTo(gfToWorld[0]);
  gunRight.copyTo(gfToWorld[1]);
  gunUp.copyTo(gfToWorld[2]);

  TransposeMatrix(gfToWorld, worldToGf);

  auto barrelToEnemyVector = targetPos - gunPos;
  vec3_t barrelToEnemyVec3_t;
  barrelToEnemyVector.copyTo(barrelToEnemyVec3_t);

  vec3_t barrelToEnemyTransformedVec3_t;
  MatrixTransformVector(barrelToEnemyVec3_t, worldToGf, barrelToEnemyTransformedVec3_t);
  Vector barrelToEnemyTransformed(barrelToEnemyTransformedVec3_t);
  barrelToEnemyTransformed.normalize();
  barrelToEnemyTransformed = barrelToEnemyTransformed.toAngles();
  barrelToEnemyTransformed.EulerNormalize();
  aimAngles = -barrelToEnemyTransformed;

  Vector aimUp, aimLeft, aimForward;
  float spreadX, spreadY;
  aimAngles.AngleVectors(&aimForward, &aimLeft, &aimUp);
  spreadX = GetDataForMyWeapon("spreadx");
  spreadY = GetDataForMyWeapon("spready");

  // figure the new projected impact point based upon computed spread
  if (_activeWeapon.weapon->GetFireType(FIRE_MODE1) == FT_PROJECTILE)
  {
    // Apply Spread
    aimForward = aimForward * _activeWeapon.weapon->GetRange(FIRE_MODE1) +
                 aimLeft * G_CRandom(spreadX) +
                 aimUp * G_CRandom(spreadY);
  }

  // after figuring spread location, re-normalize vectors
  aimForward.normalize();

  aimAngles = aimForward.toAngles();

  _activeWeapon.weapon->SetControllerTag(WEAPONBONE_BARREL_TAG, gi.Tag_NumForName(_activeWeapon.weapon->edict->s.modelindex, "tag_barrel"));
  _activeWeapon.weapon->SetControllerAngles(WEAPONBONE_BARREL_TAG, aimAngles);

  //Draw Trace
  if (g_showbullettrace->integer)
  {
    Vector test;
    GetGunPositionData(&gunPos, &gunForward);
    test = gunForward * 1000 + gunPos;

    G_DebugLine(gunPos, test, 1.0f, 0.0f, 0.0f, 1.0f);

    Vector barrelForward;
    aimAngles.AngleVectors(&barrelForward);
  }
}
Exemple #2
0
void Animate::PostAnimate( void )
{
	if( !edict->tiki ) {
		return;
	}

	float		startTime;
	float		deltaSyncTime;
	float		total_weight;
	Vector		vFrameDelta;
	bool		hasAction = false;

	deltaSyncTime = syncTime;

	if( pauseSyncTime == 0.0f )
	{
		syncTime = 1.0f / syncRate * level.frametime + deltaSyncTime;
	}

	total_weight = 0.0f;

	for( int i = 0; i < MAX_FRAMEINFOS; i++ )
	{
		if( edict->s.frameInfo[ i ].weight > 0.0f )
		{
			if( !( animFlags[ i ] & ANIM_NOACTION ) )
			{
				hasAction = true;
			}
		}

		if( animFlags[ i ] & ANIM_PAUSED ) {
			continue;
		}

		if( animFlags[ i ] & ANIM_SYNC )
		{
			startTime = deltaSyncTime * animtimes[ i ];
			edict->s.frameInfo[ i ].time = animtimes[ i ] * syncTime;
		}
		else
		{
			startTime = edict->s.frameInfo[ i ].time;
			edict->s.frameInfo[ i ].time += level.frametime;
		}

		if( animtimes[ i ] == 0.0f )
		{
			animFlags[ i ] = animFlags[ i ] & ~ANIM_NODELTA | ANIM_FINISHED;
			edict->s.frameInfo[ i ].time = 0.0f;
		}
		else
		{
			if( !( animFlags[ i ] & ANIM_NODELTA ) )
			{
				if( gi.Anim_HasDelta( edict->tiki, edict->s.frameInfo[ i ].index ) )
				{
					float vDelta[ 3 ];

					gi.Anim_DeltaOverTime( edict->tiki,
						edict->s.frameInfo[ i ].index,
						startTime,
						edict->s.frameInfo[ i ].time,
						vDelta );

					vFrameDelta += Vector( vDelta ) * edict->s.frameInfo[ i ].weight;

					total_weight += edict->s.frameInfo[ i ].weight;
				}
			}

			animFlags[ i ] &= ~ANIM_NODELTA;

			if( ( animFlags[ i ] & ANIM_SYNC && edict->s.frameInfo[ i ].time > animtimes[ i ] ) ||
				( edict->s.frameInfo[ i ].time > animtimes[ i ] - 0.01f ) )
			{
				if( animFlags[ i ] & ANIM_LOOP )
				{
					animFlags[ i ] |= ANIM_FINISHED;

					if( edict->s.frameInfo[ i ].time > animtimes[ i ] )
					{
						edict->s.frameInfo[ i ].time = 0;
					}
				}
				else
				{
					if( startTime != animtimes[ i ] )
					{
						animFlags[ i ] |= ANIM_FINISHED;
					}

					edict->s.frameInfo[ i ].time = animtimes[ i ];
				}
			}
		}

		if( total_weight != 0.0f )
			vFrameDelta *= 1.0f / total_weight;

		MatrixTransformVector( vFrameDelta, orientation, frame_delta );

		while( syncTime > 1.0f )
		{
			syncTime -= 1.0f;
		}

		total_weight = level.frametime * 4.0f;

		if( hasAction )
		{
			edict->s.actionWeight += total_weight;

			if( edict->s.actionWeight > 1.0f )
			{
				edict->s.actionWeight = 1.0f;
			}
		}
		else
		{
			edict->s.actionWeight -= total_weight;

			if( edict->s.actionWeight < 0.0f )
			{
				edict->s.actionWeight = 0.0f;
			}
		}
	}
}