public override BhvStatus Invoke(Npc a, BhvTree b) { if (a.TargetObj == null) { b.SetStatus(BhvStatus.FAILURE); return(b.Status); } if (a.Stats.Wounded) { b.SetStatus(BhvStatus.FAILURE); return(b.Status); } if (a.TargetEnt?.Stats.IsDead ?? false) { // We don't reset the move here because we still want to investigate what we were hunting a.ResetTargetObj(); b.SetStatus(BhvStatus.SUCCESS); return(b.Status); } if (!b.SeeTarget) { // Set MovePos to last known TargetPos a.SetMovePos(a.TargetPos); a.ResetTargetObj(); b.SetStatus(BhvStatus.FAILURE); return(b.Status); } if (b.DistTarget > Util.GetSquare(a.Params.AwareMax)) { b.SetStatus(BhvStatus.FAILURE); return(b.Status); } if (b.DistTarget <= Util.GetSquare(a.Params.AwareClose)) { a.PlaySound(SndT.HUNT); StopMove(a); b.SetStatus(BhvStatus.SUCCESS); return(b.Status); } if (a.NavAgent.pathStatus == NavMeshPathStatus.PathPartial || a.NavAgent.pathStatus == NavMeshPathStatus.PathInvalid) { bool failure = false; if (a.NavAgent.pathStatus == NavMeshPathStatus.PathInvalid) { failure = true; } if (a.NavAgent.pathStatus == NavMeshPathStatus.PathPartial) { if (Util.CheckDistSqr(a.NavAgent.destination, a.TargetPos) > Util.GetSquare(a.Params.AtkDist)) { failure = true; } } if (failure) { StopMove(a); b.SetPathFailed(true); b.SetStatus(BhvStatus.FAILURE); return(b.Status); } } if (a.MovePos == Vector3.zero) { a.SetMovePos(a.TargetPos); } if (a.NavAgent.hasPath) { // Sometimes the calculated destination on the nav mesh isn't exactly where we wanted to move if (a.MovePos != a.NavAgent.destination) { a.SetMovePos(a.NavAgent.destination); } } float nSpd = a.Params.MoveSpd * a.Params.MoveWalk; // Set Speed accordingly if (a.NavAgent.speed != nSpd) { SetSpeed(a, nSpd); } if (!b.AnimInfo.IsName(AnimString.WALK)) { a.PlaySound(SndT.HUNT); SetAnimTrigger(a, AnimString.WALK); } if (b.TimerCheck >= a.Params.ChkAlert) { if (a.TargetPos != a.MovePos) { a.SetMovePos(a.TargetPos); } b.TimerCheck = 0.0f; CheckEnv(a, b); } if (a.NavAgent.destination != a.MovePos) { StartMove(a, a.MovePos); } return(b.Status); }
public override BhvStatus Invoke(Npc a, BhvTree b) { if (a.TargetObj == null) { b.SetStatus(BhvStatus.SUCCESS); return(b.Status); } if (a.Stats.Wounded) { b.SetStatus(BhvStatus.FAILURE); return(b.Status); } if (b.DistTarget <= Util.GetSquare(a.Params.AwareClose)) { if (a.Params.Flighty) { a.PlaySound(SndT.ALERT); // Too close, should flee b.SetStatus(BhvStatus.FAILURE); return(b.Status); } } // Set Speed accordingly SetSpeed(a, a.Params.MoveSpd * a.Params.MoveWalk); float waryDist = ((a.Params.AwareMax - a.Params.AwareMed) / 2.0f) + a.Params.AwareMed; if (b.DistTarget <= Util.GetSquare(waryDist) && a.MovePos == Vector3.zero) { Vector3 nPos = FindFleePoint(a); if (nPos == Vector3.zero) { // Debug.Log( "Unable to find flee point" ); if (!b.AnimInfo.IsName(AnimString.IDLE)) { SetAnimTrigger(a, AnimString.IDLE); } return(BhvStatus.RUNNING); } // Debug.LogError( $"WaryFlee: {a.name} to position {nPos}" ); // Debug.Log( "Found flee point" ); b.TimerAct = 0.0f; a.SetMovePos(nPos); } if (b.TimerCheck >= a.Params.ChkAlert) { b.TimerCheck = 0.0f; CheckEnv(a, b); } if (a.NavAgent.pathPending) { return(BhvStatus.RUNNING); } if (!a.NavAgent.hasPath && a.MovePos != Vector3.zero) { StartMove(a, a.MovePos); } else { if (a.MovePos != a.NavAgent.destination) { a.SetMovePos(a.NavAgent.destination); } } if (a.MovePos != Vector3.zero) { if (a.NavAgent.hasPath) { if (!b.AnimInfo.IsName(AnimString.WALK)) { SetAnimTrigger(a, AnimString.WALK); } } else { if (a.NavAgent.velocity == Vector3.zero) { a.SetMovePos(Vector3.zero); } if (!b.AnimInfo.IsName(AnimString.IDLE)) { SetAnimTrigger(a, AnimString.IDLE); } } } if (b.DistMove <= Util.GetSquare(a.Params.StopDist + a.NavAgent.radius) && a.NavAgent.hasPath) { if (a.TargetDistSqr > Util.GetSquare(a.Params.AwareMax + 10.0f)) { a.PlaySound(SndT.ALERT); StopMove(a); // Debug.Log( "Safe distance from target, flight over" ); a.ResetTargetObj(); b.SetPathFailed(false); b.SetStatus(BhvStatus.SUCCESS); return(b.Status); } else { StopMove(a); // Debug.Log( "Resetting move for recalculation" ); } } return(b.Status); }
public override BhvStatus Invoke(Npc a, BhvTree b) { if (a.TargetObj == null) { b.SetStatus(BhvStatus.FAILURE); return(b.Status); } if (a.TargetEnt?.Stats.IsDead ?? false) { StopMove(a); a.ResetTargetObj(); b.SetStatus(BhvStatus.SUCCESS); return(b.Status); } if (b.DistTarget <= Util.GetSquare(a.Params.AtkDist)) { b.SetStatus(BhvStatus.SUCCESS); return(b.Status); } if (a.NavAgent.pathStatus == NavMeshPathStatus.PathPartial || a.NavAgent.pathStatus == NavMeshPathStatus.PathInvalid) { bool failure = false; if (a.NavAgent.pathStatus == NavMeshPathStatus.PathInvalid) { failure = true; } if (a.NavAgent.pathStatus == NavMeshPathStatus.PathPartial) { if (Util.CheckDistSqr(a.NavAgent.destination, a.TargetPos) > Util.GetSquare(a.Params.AtkDist)) { failure = true; } } if (failure) { StopMove(a); b.SetPathFailed(true); b.SetStatus(BhvStatus.FAILURE); return(b.Status); } } a.SetMovePos(a.TargetPos); float nSpd = a.Params.MoveSpd; if (b.AnimInfo.IsName(AnimString.ATK)) { nSpd *= a.Params.AtkSlow; } else { if (!b.AnimInfo.IsName(AnimString.RUN)) { SetAnimTrigger(a, AnimString.RUN); } } // Set Speed accordingly if (a.NavAgent.speed != nSpd) { SetSpeed(a, nSpd); } if (b.TimerCheck >= a.Params.ChkAlert) { if (a.TargetPos != a.MovePos) { a.SetMovePos(a.TargetPos); } b.TimerCheck = 0.0f; CheckEnv(a, b); } if (a.NavAgent.destination != a.MovePos) { StartMove(a, a.MovePos); } return(b.Status); }
public override BhvStatus Invoke(Npc a, BhvTree b) { if (a.TargetObj == null) { b.SetStatus(BhvStatus.FAILURE); return(b.Status); } if (a.TargetEnt?.Stats.IsDead ?? false) { StopMove(a); a.ResetTargetObj(); b.SetStatus(BhvStatus.SUCCESS); return(b.Status); } if (b.DistTarget > Util.GetSquare(a.Params.AtkDist)) { if (b.AnimInfo.IsName(AnimString.ATK)) { ResetAnimTrigger(a, AnimString.ATK); } StopMove(a); b.SetStatus(BhvStatus.FAILURE); return(b.Status); } if (a.NavAgent.pathStatus == NavMeshPathStatus.PathPartial || a.NavAgent.pathStatus == NavMeshPathStatus.PathInvalid) { StopMove(a); b.SetPathFailed(true); b.SetStatus(BhvStatus.FAILURE); return(b.Status); } GetFlatVectors(a, out Vector3 targetPos, out Vector3 thisPos, out Vector3 fwd); float angle = Vector3.Angle(fwd, (targetPos - thisPos)); if (angle > a.Params.RotAngle) { TurnToward(a, targetPos); } a.SetMovePos(a.TargetPos); float nSpd = a.Params.MoveSpd; if (b.AnimInfo.IsName(AnimString.ATK)) { nSpd *= a.Params.AtkSlow; } // Set Speed accordingly if (a.NavAgent.speed != nSpd) { SetSpeed(a, nSpd); } if (b.ActionReady) { if (b.TimerAct >= a.Params.AtkInit) { if (a.TargetEnt != null) { if (b.ActionReady) { a.PlaySound(SndT.ATK); if (!HubrisCore.Instance.TrySendDmg(a.TargetObj, a.TargetEnt, (int)a.Params.DamageStats.CommonType, a.Params.DamageStats.CommonAmount, false)) { Debug.LogWarning($"{a.name} could not send damage to {a.TargetObj.name}"); } } } b.SetActionReady(false); SetAnimTrigger(a, AnimString.ATK); } } else // ActionReady is false { if (a.NavAgent.velocity != Vector3.zero) { if (!b.AnimInfo.IsName(AnimString.WALK)) { SetAnimTrigger(a, AnimString.WALK); } } else { if (!b.AnimInfo.IsName(AnimString.IDLE)) { SetAnimTrigger(a, AnimString.IDLE); } } if (b.TimerAct >= a.Params.AtkEnd) { b.SetActionReady(true); b.TimerAct = 0.0f; } } if (b.TimerCheck >= a.Params.ChkAlert) { b.TimerCheck = 0.0f; CheckEnv(a, b); } if (a.NavAgent.destination != a.MovePos) { StartMove(a, a.MovePos); } b.SetPrevPos(a.transform.position); return(b.Status); }
public override BhvStatus Invoke(Npc a, BhvTree b) { if (a.TargetObj == null) { b.SetStatus(BhvStatus.SUCCESS); return(b.Status); } if (a.TargetEnt?.Stats.IsDead ?? false) { StopMove(a); a.ResetTargetObj(); b.SetStatus(BhvStatus.SUCCESS); return(b.Status); } if (!b.PathFailed && b.TimerCheck >= a.Params.ChkAlert) { b.TimerCheck = 0.0f; CheckEnv(a, b); } // Set Speed accordingly if (a.NavAgent.speed != a.Params.MoveSpd) { SetSpeed(a, a.Params.MoveSpd); } if (a.MovePos == Vector3.zero) { Vector3 nPos = FindFleePoint(a); if (nPos == Vector3.zero) { // Debug.Log( "Unable to find flee point" ); if (!b.AnimInfo.IsName(AnimString.IDLE)) { SetAnimTrigger(a, AnimString.IDLE); } return(BhvStatus.RUNNING); } // Debug.Log( "Found flee point" ); a.SetMovePos(nPos); } if (a.NavAgent.pathPending) { return(BhvStatus.RUNNING); } if (!a.NavAgent.hasPath) { StartMove(a, a.MovePos); } else { if (!b.AnimInfo.IsName(AnimString.RUN)) { SetAnimTrigger(a, AnimString.RUN); } if (a.MovePos != a.NavAgent.destination) { a.SetMovePos(a.NavAgent.destination); } // TurnToward( a, a.NavAgent.steeringTarget ); } // Need to include NavAgent.radius or else the Npc won't ever reach the MovePos if (b.DistMove <= Util.GetSquare(a.Params.StopDist + a.NavAgent.radius) && a.NavAgent.hasPath) { if ((a.TargetDistSqr > Util.GetSquare(a.Params.AwareMax + 10.0f))) { StopMove(a); // Debug.Log( "Safe distance from target, flight over" ); a.ResetTargetObj(); b.SetPathFailed(false); b.SetStatus(BhvStatus.SUCCESS); return(b.Status); } else { StopMove(a); // Debug.Log( "Resetting move for recalculation" ); } } return(b.Status); }