//----------------------------------------------------------------------------- // Purpose: Checks the validity of the given route's goaltype // Input : // Output : //----------------------------------------------------------------------------- bool CAI_BaseNPC::ValidateNavGoal() { if (GetNavigator()->GetGoalType() == GOALTYPE_COVER) { // Check if this location will block my enemy's line of sight to me if (GetEnemy()) { Activity nCoverActivity = GetCoverActivity( GetHintNode() ); Vector vCoverLocation = GetNavigator()->GetGoalPos(); // For now we have to drop the node to the floor so we can // get an accurate postion of the NPC. Should change once Ken checks in float floorZ = GetFloorZ(vCoverLocation); vCoverLocation.z = floorZ; Vector vEyePos = vCoverLocation + EyeOffset(nCoverActivity); if (!IsCoverPosition( GetEnemy()->EyePosition(), vEyePos ) ) { //Msg("BADUGI\n"); TaskFail(FAIL_BAD_PATH_GOAL); return false; } } } //Msg("BADUGI\n"); return true; }
//----------------------------------------------------------------------------- // Purpose: Spawn the entity //----------------------------------------------------------------------------- void CNPC_CeilingTurret::Spawn( void ) { Precache(); SetModel( CEILING_TURRET_MODEL ); BaseClass::Spawn(); m_HackedGunPos = Vector( 0, 0, 12.75 ); SetViewOffset( EyeOffset( ACT_IDLE ) ); m_flFieldOfView = 0.0f; m_takedamage = DAMAGE_YES; m_iHealth = 1000; m_bloodColor = BLOOD_COLOR_MECH; SetSolid( SOLID_BBOX ); AddSolidFlags( FSOLID_NOT_STANDABLE ); SetHeight( CEILING_TURRET_RETRACT_HEIGHT ); AddFlag( FL_AIMTARGET ); AddEFlags( EFL_NO_DISSOLVE ); SetPoseParameter( m_poseAim_Yaw, 0 ); SetPoseParameter( m_poseAim_Pitch, 0 ); m_iAmmoType = GetAmmoDef()->Index( "AR2" ); //Create our eye sprite m_pEyeGlow = CSprite::SpriteCreate( CEILING_TURRET_GLOW_SPRITE, GetLocalOrigin(), false ); m_pEyeGlow->SetTransparency( kRenderTransAdd, 255, 0, 0, 128, kRenderFxNoDissipation ); m_pEyeGlow->SetAttachment( this, 2 ); //Set our autostart state m_bAutoStart = !!( m_spawnflags & SF_CEILING_TURRET_AUTOACTIVATE ); m_bEnabled = ( ( m_spawnflags & SF_CEILING_TURRET_STARTINACTIVE ) == false ); //Do we start active? if ( m_bAutoStart && m_bEnabled ) { SetThink( &CNPC_CeilingTurret::AutoSearchThink ); SetEyeState( TURRET_EYE_DORMANT ); } else { SetEyeState( TURRET_EYE_DISABLED ); } //Stagger our starting times SetNextThink( gpGlobals->curtime + random->RandomFloat( 0.1f, 0.3f ) ); // Don't allow us to skip animation setup because our attachments are critical to us! SetBoneCacheFlags( BCF_NO_ANIMATION_SKIP ); }
void hhHarvesterSimple::AnimMove( void ) { idVec3 goalPos; idVec3 delta; idVec3 goalDelta; float goalDist; monsterMoveResult_t moveResult; idVec3 newDest; // Turn on physics to prevent flying harvesters BecomeActive(TH_PHYSICS); idVec3 oldorigin = physicsObj.GetOrigin(); #ifdef HUMANHEAD //jsh wallwalk idMat3 oldaxis = GetGravViewAxis(); #else idMat3 oldaxis = viewAxis; #endif AI_BLOCKED = false; if ( move.moveCommand < NUM_NONMOVING_COMMANDS ){ move.lastMoveOrigin.Zero(); move.lastMoveTime = gameLocal.time; } move.obstacle = NULL; if ( ( move.moveCommand == MOVE_FACE_ENEMY ) && enemy.GetEntity() ) { TurnToward( lastVisibleEnemyPos ); goalPos = oldorigin; } else if ( ( move.moveCommand == MOVE_FACE_ENTITY ) && move.goalEntity.GetEntity() ) { TurnToward( move.goalEntity.GetEntity()->GetPhysics()->GetOrigin() ); goalPos = oldorigin; } else if ( GetMovePos( goalPos ) ) { if ( move.moveCommand != MOVE_WANDER ) { CheckObstacleAvoidance( goalPos, newDest ); TurnToward( newDest ); } else { TurnToward( goalPos ); } } Turn(); if ( move.moveCommand == MOVE_SLIDE_TO_POSITION ) { if ( gameLocal.time < move.startTime + move.duration ) { goalPos = move.moveDest - move.moveDir * MS2SEC( move.startTime + move.duration - gameLocal.time ); delta = goalPos - oldorigin; delta.z = 0.0f; } else { delta = move.moveDest - oldorigin; delta.z = 0.0f; StopMove( MOVE_STATUS_DONE ); } } else if ( allowMove ) { #ifdef HUMANHEAD //jsh wallwalk GetMoveDelta( oldaxis, GetGravViewAxis(), delta ); #else GetMoveDelta( oldaxis, viewAxis, delta ); #endif } else { delta.Zero(); } if ( move.moveCommand == MOVE_TO_POSITION ) { goalDelta = move.moveDest - oldorigin; goalDist = goalDelta.LengthFast(); if ( goalDist < delta.LengthFast() ) { delta = goalDelta; } } #ifdef HUMANHEAD //shrink functionality float scale = renderEntity.shaderParms[SHADERPARM_ANY_DEFORM_PARM1]; if ( scale > 0.0f && scale < 2.0f ) { delta *= scale; } #endif physicsObj.SetDelta( delta ); physicsObj.ForceDeltaMove( disableGravity ); RunPhysics(); if ( ai_debugMove.GetBool() ) { // HUMANHEAD JRM - so we can see if grav is on or off if(disableGravity) { gameRenderWorld->DebugLine( colorRed, oldorigin, physicsObj.GetOrigin(), 5000 ); } else { gameRenderWorld->DebugLine( colorCyan, oldorigin, physicsObj.GetOrigin(), 5000 ); } } moveResult = physicsObj.GetMoveResult(); if ( !af_push_moveables && attack.Length() && TestMelee() ) { DirectDamage( attack, enemy.GetEntity() ); } else { idEntity *blockEnt = physicsObj.GetSlideMoveEntity(); if ( blockEnt && blockEnt->IsType( hhHarvesterSimple::Type ) ) { StopMove( MOVE_STATUS_BLOCKED_BY_MONSTER ); return; } if ( blockEnt && blockEnt->IsType( idMoveable::Type ) && blockEnt->GetPhysics()->IsPushable() ) { KickObstacles( viewAxis[ 0 ], kickForce, blockEnt ); } } BlockedFailSafe(); AI_ONGROUND = physicsObj.OnGround(); idVec3 org = physicsObj.GetOrigin(); if ( oldorigin != org ) { TouchTriggers(); } if ( ai_debugMove.GetBool() ) { gameRenderWorld->DebugBounds( colorMagenta, physicsObj.GetBounds(), org, gameLocal.msec ); gameRenderWorld->DebugBounds( colorMagenta, physicsObj.GetBounds(), move.moveDest, gameLocal.msec ); gameRenderWorld->DebugLine( colorYellow, org + EyeOffset(), org + EyeOffset() + viewAxis[ 0 ] * physicsObj.GetGravityAxis() * 16.0f, gameLocal.msec, true ); DrawRoute(); } }
Vector EyePosition( void ) { return GetAbsOrigin() + EyeOffset(GetActivity()); }
//----------------------------------------------------------------------------- // Purpose: Spawn the entity //----------------------------------------------------------------------------- void CNPC_CombineCamera::Spawn() { Precache(); SetModel(COMBINE_CAMERA_MODEL); m_pEyeFlash = CSprite::SpriteCreate(COMBINE_CAMERA_FLASH_SPRITE, GetLocalOrigin(), FALSE); m_pEyeFlash->SetTransparency(kRenderGlow, 255, 255, 255, 0, kRenderFxNoDissipation); m_pEyeFlash->SetAttachment(this, 2); m_pEyeFlash->SetBrightness(0); m_pEyeFlash->SetScale(1.0); BaseClass::Spawn(); m_HackedGunPos = Vector(0, 0, 12.75); SetViewOffset(EyeOffset(ACT_IDLE)); m_flFieldOfView = CAMERA_FOV_WIDE; m_takedamage = DAMAGE_YES; m_iHealth = 50; m_bloodColor = BLOOD_COLOR_MECH; SetSolid(SOLID_BBOX); AddSolidFlags(FSOLID_NOT_STANDABLE); SetHeight(COMBINE_CAMERA_RETRACT_HEIGHT); AddFlag(FL_AIMTARGET); SetPoseParameter(COMBINE_CAMERA_BC_YAW, 0); SetPoseParameter(COMBINE_CAMERA_BC_PITCH, 0); m_iAmmoType = GetAmmoDef()->Index("Pistol"); // Create our eye sprite m_pEyeGlow = CSprite::SpriteCreate(COMBINE_CAMERA_GLOW_SPRITE, GetLocalOrigin(), false); m_pEyeGlow->SetTransparency(kRenderWorldGlow, 255, 0, 0, 128, kRenderFxNoDissipation); m_pEyeGlow->SetAttachment(this, 2); // Set our enabled state m_bEnabled = ((m_spawnflags & SF_COMBINE_CAMERA_STARTINACTIVE) == false); // Make sure the radii are sane. if (m_nOuterRadius <= 0) { m_nOuterRadius = 300; } if (m_nInnerRadius <= 0) { m_nInnerRadius = 450; } if (m_nOuterRadius < m_nInnerRadius) { swap(m_nOuterRadius, m_nInnerRadius); } // Do we start active? if (m_bEnabled) { Deploy(); } else { SetEyeState(CAMERA_EYE_DISABLED); } //Adrian: No shadows on these guys. AddEffects( EF_NOSHADOW ); // Stagger our starting times SetNextThink( gpGlobals->curtime + random->RandomFloat(0.1f, 0.3f) ); // Don't allow us to skip animation setup because our attachments are critical to us! SetBoneCacheFlags( BCF_NO_ANIMATION_SKIP ); }