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); } }
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; } } } }