public void Update(MobAIBase aiBase, float dt) { if ((m_currentSearchTime += dt) > MaxSearchTime) { m_currentSearchTime = 0f; aiBase.Brain.Fire(Trigger.Timeout); } if (aiBase.Brain.IsInState(State.MoveToContainer)) { //Common.Dbgl($"State MoveToContainer: {KnownContainers.Peek().name}"); if (KnownContainers.Peek() == null) { aiBase.StopMoving(); KnownContainers.Pop(); aiBase.Brain.Fire(Trigger.Failed); //Common.Dbgl("Container = null"); return; } aiBase.MoveAndAvoidFire(KnownContainers.Peek().transform.position, dt, 0.5f); if (Vector3.Distance(aiBase.Instance.transform.position, KnownContainers.Peek().transform.position) < 2) { aiBase.StopMoving(); aiBase.Brain.Fire(Trigger.ContainerIsClose); //Debug.Log($"{KnownContainers.Peek().name} is close"); } return; } if (aiBase.Brain.IsInState(State.MoveToGroundItem)) { if (m_groundItem == null || m_groundItem?.GetComponent <ZNetView>()?.IsValid() != true) { m_groundItem = null; aiBase.StopMoving(); aiBase.Brain.Fire(Trigger.Failed); //Debug.Log("GroundItem = null"); return; } aiBase.MoveAndAvoidFire(m_groundItem.transform.position, dt, 0.5f); if (Vector3.Distance(aiBase.Instance.transform.position, m_groundItem.transform.position) < 1.5) { aiBase.StopMoving(); aiBase.Brain.Fire(Trigger.GroundItemIsClose); //Debug.Log("GroundItem is close"); } return; } if (aiBase.Brain.IsInState(State.OpenContainer)) { if ((m_openChestTimer += dt) > OpenChestDelay) { //Debug.Log("Open Container"); aiBase.Brain.Fire(Trigger.ContainerOpened); } } }
public void Update(MobAIBase aiBase, float dt) { if (IsBelowHealthThreshold(aiBase)) { aiBase.Brain.Fire(Trigger.Flee); return; } if (aiBase.Brain.IsInState(State.IdentifyEnemy)) { m_searchTimer -= dt; Common.Invoke <MonsterAI>(aiBase.Instance, "RandomMovementArroundPoint", dt, m_startPosition, m_circleTargetDistance, true); if (Vector3.Distance(m_startPosition, aiBase.Character.transform.position) > m_viewRange - 5) { return; } aiBase.TargetCreature = BaseAI.FindClosestEnemy(aiBase.Character, m_startPosition, m_viewRange); if (aiBase.TargetCreature != null && Vector3.Distance(m_startPosition, aiBase.TargetCreature.transform.position) < m_viewRange) { Common.Invoke <MonsterAI>(aiBase.Instance, "LookAt", aiBase.TargetCreature.transform.position); //Debug.Log("IdentifyEnemy-FoundTarget"); aiBase.Brain.Fire(Trigger.FoundTarget); return; } if (m_searchTimer <= 0) { //Debug.Log("IdentifyEnemy-NoTarget"); aiBase.StopMoving(); aiBase.Brain.Fire(Trigger.NoTarget); } return; } if (aiBase.TargetCreature == null) { aiBase.Attacker = null; aiBase.Brain.Fire(Trigger.TargetLost); //Debug.Log("TargetLost"); return; } if (aiBase.Brain.IsInState(State.TrackingEnemy)) { m_searchTimer -= dt; if (aiBase.Attacker != null && aiBase.TargetCreature != aiBase.Attacker && aiBase.Instance.CanSenseTarget(aiBase.Attacker)) { aiBase.TargetCreature = aiBase.Attacker; ////Debug.Log("TrackingEnemy-Switch target to Attacker"); } Common.Invoke <MonsterAI>(aiBase.Instance, "LookAt", aiBase.TargetCreature.transform.position); if (Vector3.Distance(m_startPosition, aiBase.Character.transform.position) > m_viewRange && (aiBase.TargetCreature != aiBase.Attacker || m_agressionLevel < 5)) { //Debug.Log("TrackingEnemy-NoTarget(lost track)"); aiBase.TargetCreature = null; aiBase.Attacker = null; aiBase.StopMoving(); aiBase.Brain.Fire(Trigger.NoTarget); return; } //Debug.Log("TrackingEnemy-MoveToTarget"); if (aiBase.MoveAndAvoidFire(aiBase.TargetCreature.transform.position, dt, Math.Max(m_weapon.m_shared.m_aiAttackRange - 0.5f, 1.0f), true)) { aiBase.StopMoving(); //Debug.Log("TrackingEnemy-Attack"); aiBase.Brain.Fire(Trigger.Attack); return; } if (m_searchTimer <= 0) { //Debug.Log("TrackingEnemy-NoTarget(timeout)"); aiBase.TargetCreature = null; aiBase.Attacker = null; aiBase.StopMoving(); aiBase.Brain.Fire(Trigger.NoTarget); } //Debug.Log("TrackingEnemy-End"); return; } if (aiBase.Brain.IsInState(State.EngagingEnemy)) { m_circleTimer -= dt; bool isLookingAtTarget = (bool)Common.Invoke <MonsterAI>(aiBase.Instance, "IsLookingAt", aiBase.TargetCreature.transform.position, 10f); bool isCloseToTarget = Vector3.Distance(aiBase.Instance.transform.position, aiBase.TargetCreature.transform.position) < m_weapon.m_shared.m_aiAttackRange; if (!isCloseToTarget) { //Debug.Log("EngagingEnemy-Attack"); aiBase.Brain.Fire(Trigger.Attack); return; } if (!isLookingAtTarget) { Common.Invoke <MonsterAI>(aiBase.Instance, "LookAt", aiBase.TargetCreature.transform.position); return; } if (m_circleTimer <= 0) { //Debug.Log("EngagingEnemy-Reposition"); aiBase.Brain.Fire(Trigger.Reposition); return; } Common.Invoke <MonsterAI>(aiBase.Instance, "DoAttack", aiBase.TargetCreature, false); //Debug.Log("EngagingEnemy-DoAttack"); return; } if (aiBase.Brain.IsInState(State.CirclingEnemy)) { m_circleTimer -= dt; Common.Invoke <MonsterAI>(aiBase.Instance, "RandomMovementArroundPoint", dt, aiBase.TargetCreature.transform.position, m_circleTargetDistance, true); if (m_circleTimer <= 0) { //Debug.Log("CirclingEnemy-Attack"); aiBase.Brain.Fire(Trigger.Attack); return; } } if (aiBase.Brain.IsInState(State.DoneFighting)) { aiBase.MoveAndAvoidFire(m_startPosition, dt, 0.5f, false); if (Vector3.Distance(m_startPosition, aiBase.Character.transform.position) < 1f) { //Debug.Log("DoneFighting-Done"); aiBase.Brain.Fire(Trigger.Done); } return; } }