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; } }