CapersProject/Assets/02.Scripts/Tycoon/CrewController.cs

191 lines
7.2 KiB
C#
Raw Normal View History

2024-10-15 18:01:16 +00:00
using System.Collections;
2024-10-14 11:13:08 +00:00
using System.Collections.Generic;
2024-10-15 18:01:16 +00:00
using System.Linq;
2024-10-14 11:13:08 +00:00
using BlueWater.Npcs.Crews;
2024-10-22 12:41:31 +00:00
using BlueWater.Npcs.Crews.Bartender;
using BlueWater.Npcs.Crews.Cleaner;
using BlueWater.Npcs.Crews.Server;
2024-10-20 17:21:39 +00:00
using BlueWater.Npcs.Customers;
2024-10-14 11:13:08 +00:00
using BlueWater.Utility;
using Sirenix.OdinInspector;
using UnityEngine;
namespace BlueWater.Tycoons
{
public class CrewController : MonoBehaviour
{
[Title("Crew 프리팹")]
[SerializeField]
private CleanerCrew _cleanerCrewPrefab;
[SerializeField]
2024-10-15 18:01:16 +00:00
private ServerCrew _servingCrewPrefab;
2024-10-14 11:13:08 +00:00
[SerializeField]
private BartenderCrew _bartenderCrewPrefab;
[Title("Crew 생성 변수")]
[SerializeField]
private Transform _cleanerCrewSpawnTransform;
[SerializeField]
private Transform _servingCrewSpawnTransform;
[SerializeField]
2024-12-02 11:43:08 +00:00
private List<Transform> _bartenderCrewSpawnTransforms = new(5);
2024-10-14 11:13:08 +00:00
[field: Title("실시간 데이터")]
[field: SerializeField]
public List<Crew> Crews { get; private set; }
[field: SerializeField]
public List<CleanerCrew> CleanerCrews { get; private set; }
[field: SerializeField]
2024-10-15 18:01:16 +00:00
public List<ServerCrew> ServerCrews { get; private set; }
2024-10-14 11:13:08 +00:00
[field: SerializeField]
public List<BartenderCrew> BartenderCrews { get; private set; }
private void Start()
{
EventManager.OnCreateCleanerCrew += CreateCleanerCrew;
2024-10-15 18:01:16 +00:00
EventManager.OnCreateServerCrew += CreateServerCrew;
2024-10-14 11:13:08 +00:00
EventManager.OnCreateBartenderCrew += CreateBartenderCrew;
2024-10-20 17:21:39 +00:00
EventManager.OnOrderedCocktail += FindBartenderCrew;
2024-10-14 11:13:08 +00:00
}
private void OnDestroy()
{
EventManager.OnCreateCleanerCrew -= CreateCleanerCrew;
2024-10-15 18:01:16 +00:00
EventManager.OnCreateServerCrew -= CreateServerCrew;
2024-10-14 11:13:08 +00:00
EventManager.OnCreateBartenderCrew -= CreateBartenderCrew;
2024-10-20 17:21:39 +00:00
EventManager.OnOrderedCocktail -= FindBartenderCrew;
2024-10-14 11:13:08 +00:00
}
public CleanerCrew CreateCleanerCrew()
{
var newCrew = Instantiate(_cleanerCrewPrefab, _cleanerCrewSpawnTransform.position, _cleanerCrewPrefab.transform.rotation);
Utils.RegisterList(CleanerCrews, newCrew);
Utils.RegisterList(Crews, newCrew);
newCrew.Initialize();
2024-11-07 09:13:54 +00:00
EventManager.InvokeUpdateCrewUi(BartenderCrews.Count, ServerCrews.Count, CleanerCrews.Count);
2024-12-17 11:25:53 +00:00
if (!ES3.Load(SaveData.TutorialF, false))
{
EventManager.InvokeTutorial(TutorialName.TutorialF);
ES3.Save(SaveData.TutorialF, true);
}
2024-10-14 11:13:08 +00:00
return newCrew;
}
2024-10-15 18:01:16 +00:00
public ServerCrew CreateServerCrew()
2024-10-14 11:13:08 +00:00
{
var newCrew = Instantiate(_servingCrewPrefab, _servingCrewSpawnTransform.position, _servingCrewPrefab.transform.rotation);
2024-10-15 18:01:16 +00:00
Utils.RegisterList(ServerCrews, newCrew);
2024-10-14 11:13:08 +00:00
Utils.RegisterList(Crews, newCrew);
newCrew.Initialize();
2024-11-07 09:13:54 +00:00
EventManager.InvokeUpdateCrewUi(BartenderCrews.Count, ServerCrews.Count, CleanerCrews.Count);
2024-12-17 11:25:53 +00:00
if (!ES3.Load(SaveData.TutorialD, false))
{
EventManager.InvokeTutorial(TutorialName.TutorialD);
ES3.Save(SaveData.TutorialD, true);
}
2024-10-14 11:13:08 +00:00
return newCrew;
}
public BartenderCrew CreateBartenderCrew()
{
2024-12-02 11:43:08 +00:00
int randomIndex = Random.Range(0, _bartenderCrewSpawnTransforms.Count);
Transform spawnTransform = _bartenderCrewSpawnTransforms[randomIndex];
_bartenderCrewSpawnTransforms.Remove(spawnTransform);
var newCrew = Instantiate(_bartenderCrewPrefab, spawnTransform.position, _bartenderCrewPrefab.transform.rotation);
2024-10-14 11:13:08 +00:00
Utils.RegisterList(BartenderCrews, newCrew);
Utils.RegisterList(Crews, newCrew);
2024-12-02 11:43:08 +00:00
newCrew.SetBartenderTable(spawnTransform.GetComponentInParent<BartenderTable>());
2024-10-14 11:13:08 +00:00
newCrew.Initialize();
2024-11-07 09:13:54 +00:00
EventManager.InvokeUpdateCrewUi(BartenderCrews.Count, ServerCrews.Count, CleanerCrews.Count);
2024-12-17 11:25:53 +00:00
if (!ES3.Load(SaveData.TutorialE, false))
{
EventManager.InvokeTutorial(TutorialName.TutorialE);
ES3.Save(SaveData.TutorialE, true);
}
2024-10-14 11:13:08 +00:00
return newCrew;
}
2024-10-15 18:01:16 +00:00
public T FindClosestAvailableCrew<T>(Vector3 position, List<T> crews) where T : Crew
{
if (crews == null || crews.Count == 0) return null;
var availableCrews = crews.Where(crew => !crew.IsOnMission).ToList();
if (availableCrews.Count == 0) return null;
return availableCrews
.OrderBy(crew => Vector3.Distance(crew.transform.position, position))
.FirstOrDefault();
}
public IEnumerator FindClosestCrewCoroutine<T>(Vector3 position, List<T> crews, System.Action<T> onCrewFoundEvent) where T : Crew
{
var waitTime = new WaitForSeconds(2f);
while (true)
{
var closestCrew = FindClosestAvailableCrew(position, crews);
if (closestCrew != null)
{
onCrewFoundEvent?.Invoke(closestCrew);
yield break;
}
yield return waitTime;
}
}
2024-10-20 17:21:39 +00:00
private void FindBartenderCrew(Customer orderedCustomer)
{
StartCoroutine(FindBartenderCrewCoroutine(orderedCustomer));
}
private IEnumerator FindBartenderCrewCoroutine(Customer orderedCustomer)
{
var waitTime = new WaitForSeconds(2f);
2024-10-29 12:17:00 +00:00
var tycoonManager = TycoonManager.Instance;
var tycoonIngredientController = tycoonManager.TycoonIngredientController;
var orderedCocktailData = orderedCustomer.OrderedCocktailData;
2024-10-28 12:02:31 +00:00
yield return new WaitForSeconds(0.5f);
2024-10-20 17:21:39 +00:00
while (true)
{
2024-10-29 12:17:00 +00:00
var orderedCount = tycoonManager.CustomerController.OrderedCocktailCount(orderedCocktailData.Idx);
if (!tycoonManager.TycoonStageController.CanMakingCocktail(orderedCocktailData.Idx, orderedCount))
{
yield return waitTime;
continue;
}
2024-10-20 17:21:39 +00:00
foreach (var element in BartenderCrews)
{
2024-10-27 09:44:22 +00:00
if (element.MyBartenderTable.CurrentPickupItem != null || element.IsOnMission) continue;
2024-10-20 17:21:39 +00:00
2024-10-29 12:17:00 +00:00
var orderedCocktailIngredients = orderedCocktailData.ValidIngredients;
2024-10-20 17:21:39 +00:00
if (!tycoonIngredientController.IsMakingCocktail(orderedCocktailIngredients)) break;
2024-10-27 09:44:22 +00:00
if (orderedCustomer.IsReceivedItem || orderedCustomer.IsMatchedServer) yield break;
2024-10-20 17:21:39 +00:00
element.SetOrderedCustomer(orderedCustomer);
tycoonIngredientController.ConsumeMakingCocktailIngredient(orderedCocktailIngredients);
yield break;
}
yield return waitTime;
}
}
2024-10-14 11:13:08 +00:00
}
}