OldBlueWater/BlueWater/Assets/02.Scripts/Npc/Guest/FindTableState.cs

97 lines
2.5 KiB
C#
Raw Normal View History

using UnityEngine;
using UnityEngine.AI;
2024-01-02 08:17:10 +00:00
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class FindTableState : INpcState
{
2024-01-02 08:17:10 +00:00
private TycoonNpc npc;
private Table[] tables;
2024-01-02 08:17:10 +00:00
public FindTableState(TycoonNpc npc)
{
2024-01-02 08:17:10 +00:00
this.npc = npc;
tables = npc.MapInfo.Tables.GetComponentsInChildren<Table>();
}
public void OnEnter(NpcStateMachine npcStateMachine)
{
CheckAndAssignSeat();
}
public void OnUpdate(NpcStateMachine npcStateMachine)
{
2024-01-02 08:17:10 +00:00
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>();
2023-12-28 06:49:30 +00:00
if (currentTables.Length != tables.Length)
{
tables = currentTables;
CheckAndAssignSeat();
}
2024-01-02 08:17:10 +00:00
}
private void CheckAndUpdateTables()
{
foreach (var table in tables)
2023-12-28 06:49:30 +00:00
{
2024-01-02 08:17:10 +00:00
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;
2023-12-28 06:49:30 +00:00
}
2024-01-02 08:17:10 +00:00
npc.AssignedSeat = seat;
npc.AssignedSeat.IsUsing = true;
npc.DoSeat = true;
}
private void CheckAndAssignSeat()
{
2024-01-02 08:17:10 +00:00
if (!npc.DoSeat)
{
2024-01-02 08:17:10 +00:00
foreach (var table in tables)
{
2024-01-02 08:17:10 +00:00
foreach (var seat in table.SeatPoints)
{
if (seat.IsUsing) continue;
2024-01-02 08:17:10 +00:00
AssignSeatToNpc(seat);
return;
}
}
2024-01-02 08:17:10 +00:00
Debug.Log("All tables are occupied. No place to sit");
}
}
public void OnExit(NpcStateMachine npcStateMachine)
{
2023-12-28 06:49:30 +00:00
}
}
2024-01-02 08:17:10 +00:00
}