Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 101 additions & 9 deletions Albion/Albion_Direct/Pathing/ClusterPathingRequest.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Stateless;
using Stateless;
using System.Collections.Generic;
using UnityEngine;

Expand All @@ -14,9 +14,15 @@ public class ClusterPathingRequest
private SimulationObjectView _target;

private List<Vector3> _path;
private List<Vector3> _completedpath;

private StateMachine<State, Trigger> _state;

DateTime _pauseTimer;
//Moving fields
private float noMovementThreshold = .0001f;
private const int noMovementFrames = 2;
Vector3[] previousLocations = new Vector3[noMovementFrames];
private bool isMoving;
#endregion Fields

#region Properties and Events
Expand All @@ -33,16 +39,22 @@ public ClusterPathingRequest(LocalPlayerCharacterView player, SimulationObjectVi
_target = target;

_path = path;
_completedpath = new List<Vector3>();

_useCollider = useCollider;

DateTime _pauseTimer = DateTime.Now;
_state = new StateMachine<State, Trigger>(State.Start);

_state.Configure(State.Start)
.Permit(Trigger.ApproachTarget, State.Running);
.Permit(Trigger.ApproachTarget, State.Running);

_state.Configure(State.Running)
.Permit(Trigger.ReachedTarget, State.Finish);
.Permit(Trigger.ReachedTarget, State.Finish)
.Permit(Trigger.Stuck, State.Pause);

_state.Configure(State.Pause)
.Permit(Trigger.ReachedTarget, State.Finish)
.Permit(Trigger.ApproachTarget, State.Running);
}

#endregion Constructors and Cleanup
Expand All @@ -53,6 +65,41 @@ public void Continue()
{
switch (_state.State)
{

case State.Pause:
{
if (DateTime.Now > _pauseTimer)
{
_state.Fire(Trigger.ReachedTarget);
}


if (_completedpath.Count < 2)
{
Core.Log("moving to random Location");
Vector3 randomSpot = new Vector3(UnityEngine.Random.Range(-100f, 100f), 0, UnityEngine.Random.Range(-100f, 100f)) + _player.transform.position;
_completedpath.Add(randomSpot);
break;
}
var previousNode = _completedpath[_completedpath.Count - 1];
var playerPosV2 = new Vector2(_player.transform.position.x, _player.transform.position.z);
var previousNodeV2 = new Vector2(previousNode.x, previousNode.z);

var distancePreviousToNode = (playerPosV2 - previousNodeV2).sqrMagnitude;
var minimumDistance = 1f;

if (distancePreviousToNode < minimumDistance)
{
Core.Log("Reached Previous Node");

}
else
{
_player.RequestMove(previousNode);
}

break;
}
case State.Start:
{
if (_path.Count > 0)
Expand All @@ -66,14 +113,23 @@ public void Continue()
case State.Running:
{
//Early exit if one of them is null.
if (_player == null)
if (_player == null || _target == null)
{
_state.Fire(Trigger.ReachedTarget);
break;
}
isMovingUpdate();
//Core.Log($"Cluster Pathing Request. Player at {_player.transform.position}. Player is move {IsMoving}");

if (!IsMoving)
{
_state.Fire(Trigger.Stuck);
_pauseTimer = DateTime.Now + TimeSpan.FromSeconds(0.5);
Core.Log("Stuck Cluster Pathing Request");
break;
}
var currentNode = _path[0];
var minimumDistance = 2f;
var minimumDistance = 3f;

if (_path.Count < 2 && _useCollider)
{
Expand All @@ -89,6 +145,7 @@ public void Continue()

if (distanceToNode < minimumDistance)
{
_completedpath.Add(_path[0]);
_path.RemoveAt(0);
}
else
Expand All @@ -105,19 +162,54 @@ public void Continue()
}
}

//check for moving
public bool IsMoving
{
get { return isMoving; }
}

void isMovingUpdate()
{

for (int i = 0; i < previousLocations.Length - 1; i++)
{
previousLocations[i] = previousLocations[i + 1];
}
previousLocations[previousLocations.Length - 1] = _player.transform.position;


for (int i = 0; i < previousLocations.Length - 1; i++)
{
// Core.Log($"Distance is {Vector3.Distance(previousLocations[i], previousLocations[i + 1])}. Threshold is {noMovementThreshold}");
if (Vector3.Distance(previousLocations[i], previousLocations[i + 1]) >= noMovementThreshold)
{
isMoving = true;
// Core.Log($"IsMoving true = {isMoving}");
break;
}
else
{
isMoving = false;
// Core.Log($"IsMoving false = {isMoving}");

}
}
}
#endregion Methods

private enum Trigger
{
ApproachTarget,
ReachedTarget,
Stuck
}

private enum State
{
Start,
Running,
Finish
Finish,
Pause
}
}
}
}