97 lines
2.5 KiB
C#
97 lines
2.5 KiB
C#
using UnityEngine;
|
|
using UnityEngine.AI;
|
|
|
|
// ReSharper disable once CheckNamespace
|
|
namespace BlueWaterProject
|
|
{
|
|
public class FindTableState : INpcState
|
|
{
|
|
private TycoonNpc npc;
|
|
private Table[] tables;
|
|
|
|
public FindTableState(TycoonNpc npc)
|
|
{
|
|
this.npc = npc;
|
|
tables = npc.MapInfo.Tables.GetComponentsInChildren<Table>();
|
|
}
|
|
|
|
public void OnEnter(NpcStateMachine npcStateMachine)
|
|
{
|
|
CheckAndAssignSeat();
|
|
}
|
|
|
|
public void OnUpdate(NpcStateMachine npcStateMachine)
|
|
{
|
|
UpdateTablesIfNecessary();
|
|
CheckAndUpdateTables();
|
|
|
|
if (npc.DoSeat && !npc.Agent.pathPending && npc.Agent.remainingDistance <= 0.5f)
|
|
{
|
|
npcStateMachine.ChangeState(new FoodOrderState(npc));
|
|
}
|
|
}
|
|
|
|
private void UpdateTablesIfNecessary()
|
|
{
|
|
var currentTables = npc.MapInfo.Tables.GetComponentsInChildren<Table>();
|
|
if (currentTables.Length != tables.Length)
|
|
{
|
|
tables = currentTables;
|
|
CheckAndAssignSeat();
|
|
}
|
|
}
|
|
|
|
private void CheckAndUpdateTables()
|
|
{
|
|
if (npc.DoSeat) return;
|
|
foreach (var table in tables)
|
|
{
|
|
foreach (var seat in table.SeatPoints)
|
|
{
|
|
if (!seat.IsUsing)
|
|
{
|
|
AssignSeatToNpc(seat);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void AssignSeatToNpc(Seat seat)
|
|
{
|
|
npc.Agent.SetDestination(seat.transform.position);
|
|
|
|
// if (npc.AssignedSeat != null)
|
|
// {
|
|
// npc.AssignedSeat.IsUsing = false;
|
|
// npc.AssignedSeat.IsDirty = true;
|
|
// }
|
|
|
|
npc.AssignedSeat = seat;
|
|
npc.AssignedSeat.IsUsing = true;
|
|
npc.DoSeat = true;
|
|
}
|
|
|
|
private void CheckAndAssignSeat()
|
|
{
|
|
if (!npc.DoSeat)
|
|
{
|
|
foreach (var table in tables)
|
|
{
|
|
foreach (var seat in table.SeatPoints)
|
|
{
|
|
if (seat.IsUsing) continue;
|
|
AssignSeatToNpc(seat);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void OnExit(NpcStateMachine npcStateMachine)
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|