private void OnDeath() { if (m_bDeathTriggered == false) { m_bDeathTriggered = true; GetAnimator().SetBool("Investigate", false); GetAnimator().SetBool("Attack", false); GetAnimator().SetBool("Moving", false); GetAIAttack().Cleanup(); if (m_SmokeVFX != null) { m_SmokeVFX.Cleanup(); } TryResetPath(); if (GetAgent().enabled == true) { GetAgent().isStopped = true; GetAgent().enabled = false; } Destroy(GetAgent()); CAIManager.RemoveAI_BothLists(this); CAIManager.RemoveFromCombatList(this); CAIManager.RemoveFromInvestigateList(this); } else { m_fDeathTimer += Time.deltaTime; if (m_fDeathTimer > m_fDestroyAfterDuration) { Destroy(gameObject); } } }
//for setting combat to false slowly based on CSenses.m_fTimeToLoseSight variable public bool LoseCombatSlowly( ) { m_fLoseSightTimer -= Time.deltaTime; if (m_fLoseSightTimer < 0.0f) { m_fLoseSightTimer = m_Senses.GetTimeUntilLoseSight(); m_bCombat = false; CAIManager.RemoveFromCombatList(this); return(true); } return(false); }
public void SetState(State newState) { //SetIsInvestigating( false ); //print(gameObject.name + "'s state is " + newState); m_eState = newState; if (m_eState == State.Idle) { //SetIdle( true ); m_fIdleTimer = 0; m_fSecToGenerateDest = Random.Range(m_fSecToGenerateDestBase - m_fTimeVariation, m_fSecToGenerateDestBase + m_fTimeVariation); } else if (m_eState == State.Wander) { float randomX, randomZ; randomX = Random.Range(-m_fDistanceVariation, m_fDistanceVariation); randomZ = Random.Range(-m_fDistanceVariation, m_fDistanceVariation); Vector3 wanderPos = new Vector3(transform.position.x + randomX + GetAgent().stoppingDistance, transform.position.y, transform.position.z + randomZ + GetAgent().stoppingDistance); if (TrySetDestination(wanderPos) == false) //( GetAgent().SetDestination( wanderPos ) == false ) { //if agent was unable to set a path SetState(State.Idle); } CSoundBank.Instance.AIIdle(m_eAIType, gameObject); } else if (m_eState == State.Investigate) { SetIsInvestigating(true); if (m_bStationary == false) { TrySetDestination(GetPOI()); } else { RotateAI(GetPOI()); //RotateAIBool(GetPOI(), 0.9f); } CAIManager.AddToInvestigateList(this); } if (m_eState != State.Investigate) { m_fInvestigateTimer = 0.0f; SetIsInvestigating(false); } }
public void ResetPOI() { m_fInvestigateTimer = 0.0f; /// m_vPointOfInterest = Vector3.zero; CAIManager.RemoveFromInvestigateList(this); }
public void Update() { //print(gameObject.name + "'s state :" + m_eInternalState); if (gameObject.activeInHierarchy == false) { //print( gameObject.name + " is not active and Triggered a failsafe here." ); return; } if (GetHealth().GetIsAlive() == false) { //Death stuff, cleanups etc OnDeath(); return; } if (GetAgent().enabled == false) { //print( gameObject.name + "'s agent is not enabled and Triggered a failsafe here." ); return; } OnUpdateStarted(); if (GetAIAttack().GetIsAttacking() == true || m_bStationary == true) { m_bCanMove = false; } if (GetAgent().hasPath == true) { if (GetStatusEffects().GetIsPushed() == false) { if (transform.position != GetPreviousPosition()) { SetIsMoving(true); } } } /////INVESTIGATE POI///// if (GetCombat() == false) { if (GetCombatPreviousFrame() == true) { m_Senses.SetSightCone(m_Senses.GetNormalSightCone()); } if (HasPOI() == true) { SetState(State.Investigate); } } /////INVESTIGATE POI///// else //GetCombat == true { if (GetCombatPreviousFrame() == false) { m_Senses.SetSightCone(m_Senses.GetCombatSightCone()); CAIManager.AddToCombatList(this); CSoundBank.Instance.AIEnterCombat(GetAIType(), gameObject); //Alert enemies nearby and Engage //print("ALERT CODE WAS RUN"); CNoiseSystem.Alert(CPlayerControlls.GetPlayer().transform.position, m_fAlertNoise); } //Attack state SetState(State.Attack); } UpdateAnimations(); switch (m_eState) { case State.Idle: { //WANDER interaction m_fIdleTimer += Time.deltaTime; if (m_fIdleTimer >= m_fSecToGenerateDest) { if (m_bStationary == false) { SetState(State.Wander); } //else remain in idle } } break; case State.Wander: { //IDLE interaction if (DestinationReached() == true) { SetState(State.Idle); } } break; case State.Investigate: { //play investigation emote //investigate walk? if (DestinationReached() == true) { if (RotateAIBool(GetPOI(), 0.90f) == true) { TryResetPath(); } //On reach destination, rotate head for a couple of seconds, then return? } if (GetIsMoving() == false) { m_fInvestigateTimer += Time.deltaTime; if (m_fInvestigateTimer > m_fInvestigateDuration) { ///m_fInvestigateTimer = 0.0f; ResetPOI(); if (m_bStationary == true) { SetState(State.Idle); } else { SetState(State.Wander); } } } } break; case State.Wait: break; case State.Attack: { if (Vector3.Distance(transform.position, m_PlayerTransform.position) <= GetAIAttack().GetAttackRange()) //m_fAttackRange ) { TryResetPath(); if (GetAIAttack().GetCanAttack() == true) { if (GetAttackStyle() == AttackStyle.Melee) { if (RotateAIBool(m_PlayerTransform.position, 0.90f) == true) { if (GetAIType() == AIType.Orc) { int iRandom; iRandom = Random.Range(0, 2); //means 0 to 1 GetAIAttack().Attack(iRandom); CSoundBank.Instance.AIMelee(m_eAIType, iRandom, gameObject); } else { GetAnimator().SetBool("Collided", false); GetAIAttack().Attack(0); CSoundBank.Instance.GoblinMeleeAttack(gameObject); } } } else { if (RotateAIBool(m_PlayerTransform.position, 0.3f)) { GetAIAttack().Attack(m_PlayerTransform.position); //CSoundBank.Instance.GoblinRangedAttack(gameObject); } } } if (GetAIAttack().GetIsAttacking() == false) { RotateAI(m_PlayerTransform.position); } } else { TrySetDestination(m_PlayerTransform.position); //print("Running toward player in Combat mode"); if (m_bStationary == false) { TrySetDestination(GetPOI()); } else { RotateAI(GetPOI()); } } } break; default: break; } OnUpdateFinished(); }
private void Awake() { CAIManager.AddAI_AllAIList(this); }