EVERYTHING
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
[DisallowMultipleComponent]
|
||||
public sealed class GetPositionBehavior : NodeBehavior
|
||||
{
|
||||
private bool evaluating;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
Recompute();
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
Recompute();
|
||||
}
|
||||
|
||||
public override void OnInputValueChanged(string inputPortName, BSValue value)
|
||||
{
|
||||
Recompute();
|
||||
}
|
||||
|
||||
private void Recompute()
|
||||
{
|
||||
if (Node == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (evaluating)
|
||||
{
|
||||
ClearOutputsForCurrentTarget();
|
||||
return;
|
||||
}
|
||||
evaluating = true;
|
||||
try
|
||||
{
|
||||
BSValue inputValue = GetInputValue("Group");
|
||||
if (inputValue.Kind == BSValueKind.Player)
|
||||
{
|
||||
RecomputePlayer(inputValue.AsPlayerId());
|
||||
}
|
||||
else if (base.IsAuthoritative)
|
||||
{
|
||||
if (!TryGetInputGroup("Group", out var group) || group == null)
|
||||
{
|
||||
ClearOutputsSynced();
|
||||
return;
|
||||
}
|
||||
SetOutputValueIfChanged("X", BSValue.FromNumber(group.position.x));
|
||||
SetOutputValueIfChanged("Y", BSValue.FromNumber(group.position.y));
|
||||
SetOutputValueIfChanged("Z", BSValue.FromNumber(group.position.z));
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
Debug.LogException(exception, this);
|
||||
ClearOutputsForCurrentTarget();
|
||||
}
|
||||
finally
|
||||
{
|
||||
evaluating = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void RecomputePlayer(int playerId)
|
||||
{
|
||||
Transform transform = NodePlayerUtility.ResolveHeadTransform(NodePlayerUtility.ResolvePlayer(playerId));
|
||||
if (transform == null)
|
||||
{
|
||||
ClearOutputsLocal();
|
||||
return;
|
||||
}
|
||||
Vector3 vector = NodePlayerUtility.WorldToVoxelPosition(transform.position);
|
||||
SetLocalOutputValueIfChanged("X", BSValue.FromNumber(vector.x));
|
||||
SetLocalOutputValueIfChanged("Y", BSValue.FromNumber(vector.y));
|
||||
SetLocalOutputValueIfChanged("Z", BSValue.FromNumber(vector.z));
|
||||
}
|
||||
|
||||
private void ClearOutputsLocal()
|
||||
{
|
||||
SetLocalOutputValueIfChanged("X", BSValue.None);
|
||||
SetLocalOutputValueIfChanged("Y", BSValue.None);
|
||||
SetLocalOutputValueIfChanged("Z", BSValue.None);
|
||||
}
|
||||
|
||||
private void ClearOutputsSynced()
|
||||
{
|
||||
SetOutputValueIfChanged("X", BSValue.None);
|
||||
SetOutputValueIfChanged("Y", BSValue.None);
|
||||
SetOutputValueIfChanged("Z", BSValue.None);
|
||||
}
|
||||
|
||||
private void ClearOutputsForCurrentTarget()
|
||||
{
|
||||
if (GetInputValue("Group").Kind == BSValueKind.Player)
|
||||
{
|
||||
ClearOutputsLocal();
|
||||
}
|
||||
else if (base.IsAuthoritative)
|
||||
{
|
||||
ClearOutputsSynced();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user