namespace Fusion.Addons.KCC
{
using System.Collections.Generic;
using UnityEngine;
///
/// Container for collision-based interactions. Collider and Processor need to be cached (accessed every frame).
///
public sealed partial class KCCCollision : KCCInteraction
{
// PUBLIC MEMBERS
public Collider Collider;
public IKCCProcessor Processor;
// KCCInteraction INTERFACE
public override void Initialize()
{
Collider = NetworkObject.GetComponentNoAlloc();
Processor = Provider is IKCCProcessorProvider processorProvider ? processorProvider.GetProcessor() : null;
}
public override void Deinitialize()
{
Collider = null;
Processor = null;
}
public override void CopyFromOther(KCCCollision other)
{
Collider = other.Collider;
Processor = other.Processor;
}
}
///
/// Collection dedicated to tracking of collision-based interactions with colliders/triggers and related processors. Managed entirely by KCC component.
///
public sealed partial class KCCCollisions : KCCInteractions
{
// PUBLIC METHODS
public bool HasCollider(Collider collider)
{
return Find(collider, out int index) != null;
}
public bool HasProcessor() where T : class
{
for (int i = 0, count = All.Count; i < count; ++i)
{
if (All[i].Processor is T)
return true;
}
return false;
}
public bool HasProcessor(T processor) where T : Component, IKCCProcessor
{
for (int i = 0, count = All.Count; i < count; ++i)
{
if (object.ReferenceEquals(All[i].Processor, processor) == true)
return true;
}
return false;
}
public T GetProcessor() where T : class
{
for (int i = 0, count = All.Count; i < count; ++i)
{
if (All[i].Processor is T processor)
return processor;
}
return default;
}
public void GetProcessors(List processors, bool clearList = true) where T : class
{
if (clearList == true)
{
processors.Clear();
}
for (int i = 0, count = All.Count; i < count; ++i)
{
if (All[i].Processor is T processor)
{
processors.Add(processor);
}
}
}
public KCCCollision Add(NetworkRunner networkRunner, NetworkObject networkObject, IKCCInteractionProvider provider, Collider collider)
{
KCCCollision collision = GetFromPool();
collision.Collider = collider;
collision.Processor = provider is IKCCProcessorProvider processorProvider ? processorProvider.GetProcessor() : null;
AddInternal(collision, networkRunner, networkObject, provider, false);
return collision;
}
// PRIVATE METHODS
private KCCCollision Find(Collider collider, out int index)
{
for (int i = 0, count = All.Count; i < count; ++i)
{
KCCCollision collision = All[i];
if (object.ReferenceEquals(collision.Collider, collider) == true)
{
index = i;
return collision;
}
}
index = -1;
return default;
}
}
}