Files
FORT-BO/Assets/CONTENT/Game/Scripts/Workstations/Processing/NetworkItemInputSlot.cs
T
2026-08-13 08:33:12 +03:00

80 lines
2.1 KiB
C#

using System.Collections.Generic;
using UnityEngine;
[DisallowMultipleComponent]
[RequireComponent(typeof(Collider))]
public sealed class NetworkItemInputSlot : MonoBehaviour
{
[SerializeField] private NetworkItemProcessingWorkstation workstation;
private readonly Dictionary<NetworkItem, HashSet<Collider>> overlaps = new();
private void Reset()
{
workstation = GetComponentInParent<NetworkItemProcessingWorkstation>();
GetComponent<Collider>().isTrigger = true;
}
private void Awake()
{
if (workstation == null)
workstation = GetComponentInParent<NetworkItemProcessingWorkstation>();
}
private void OnDisable() => overlaps.Clear();
private void OnTriggerEnter(Collider other)
{
RegisterOverlap(other);
TryAccept(other);
}
private void OnTriggerStay(Collider other)
{
RegisterOverlap(other);
TryAccept(other);
}
private void OnTriggerExit(Collider other)
{
if (workstation == null || !workstation.IsServer)
return;
NetworkItem item = other.GetComponentInParent<NetworkItem>();
if (item == null || !overlaps.TryGetValue(item, out HashSet<Collider> colliders))
return;
colliders.Remove(other);
if (colliders.Count > 0)
return;
overlaps.Remove(item);
workstation.NotifyItemExited(item);
}
private void TryAccept(Collider other)
{
if (workstation == null || !workstation.IsServer || !workstation.IsSpawned)
return;
NetworkItem item = other.GetComponentInParent<NetworkItem>();
if (item != null)
workstation.TryAcceptItem(item);
}
private void RegisterOverlap(Collider other)
{
NetworkItem item = other.GetComponentInParent<NetworkItem>();
if (item == null)
return;
if (!overlaps.TryGetValue(item, out HashSet<Collider> colliders))
{
colliders = new HashSet<Collider>();
overlaps.Add(item, colliders);
}
colliders.Add(other);
}
}