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(); } 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
(); 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) { } } }