63 lines
1.9 KiB
C#
63 lines
1.9 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
[DisallowMultipleComponent]
|
|
public sealed class RayBehavior : NodeBehavior
|
|
{
|
|
public override void OnRun(string inputPortName)
|
|
{
|
|
if (base.IsAuthoritative && string.Equals(inputPortName, "Cast", StringComparison.Ordinal))
|
|
{
|
|
Vector3 origin = ResolvePosition(GetInputValue("Origin"));
|
|
Vector3 vector = ResolveDirection(GetInputValue("Direction"));
|
|
float maxDistance = Mathf.Max(0f, (float)GetInputNumber("Distance"));
|
|
if (Physics.Raycast(new Ray(origin, (vector.sqrMagnitude > 0.0001f) ? vector.normalized : Vector3.forward), out var hitInfo, maxDistance))
|
|
{
|
|
Vector3 vector2 = NodePlayerUtility.WorldToVoxelPosition(hitInfo.point);
|
|
SetOutputValueIfChanged("DidHit", BSValue.FromBool(value: true));
|
|
SetOutputValueIfChanged("X", BSValue.FromNumber(vector2.x));
|
|
SetOutputValueIfChanged("Y", BSValue.FromNumber(vector2.y));
|
|
SetOutputValueIfChanged("Z", BSValue.FromNumber(vector2.z));
|
|
TriggerOutput("Hit");
|
|
}
|
|
else
|
|
{
|
|
SetOutputValueIfChanged("DidHit", BSValue.FromBool(value: false));
|
|
TriggerOutput("Miss");
|
|
}
|
|
}
|
|
}
|
|
|
|
private static Vector3 ResolvePosition(BSValue value)
|
|
{
|
|
if (value.Kind == BSValueKind.Player)
|
|
{
|
|
Transform transform = NodePlayerUtility.ResolveHeadTransform(NodePlayerUtility.ResolvePlayer(value.AsPlayerId()));
|
|
if (!(transform != null))
|
|
{
|
|
return Vector3.zero;
|
|
}
|
|
return transform.position;
|
|
}
|
|
if (value.TryResolveGroup(out var group) && group != null)
|
|
{
|
|
return group.GetWorldBounds().center;
|
|
}
|
|
return Vector3.zero;
|
|
}
|
|
|
|
private static Vector3 ResolveDirection(BSValue value)
|
|
{
|
|
if (value.Kind == BSValueKind.Player)
|
|
{
|
|
Transform transform = NodePlayerUtility.ResolveHeadTransform(NodePlayerUtility.ResolvePlayer(value.AsPlayerId()));
|
|
if (!(transform != null))
|
|
{
|
|
return Vector3.forward;
|
|
}
|
|
return transform.forward;
|
|
}
|
|
return Vector3.forward;
|
|
}
|
|
}
|