Files
beyond/Assets/ThirdParty/PlayMaker/Actions/Array/ArrayTransferValue.cs
2024-11-20 15:21:28 +01:00

123 lines
3.1 KiB
C#

// (c) Copyright HutongGames, LLC 2010-2014. All rights reserved.
using UnityEngine;
using System.Collections.Generic;
namespace HutongGames.PlayMaker.Actions
{
[NoActionTargets]
[ActionCategory(ActionCategory.Array)]
[Tooltip("Transfer a value from one array to another, basically a copy/cut paste action on steroids.")]
public class ArrayTransferValue : FsmStateAction
{
public enum ArrayTransferType {Copy,Cut,nullify};
public enum ArrayPasteType {AsFirstItem,AsLastItem,InsertAtSameIndex,ReplaceAtSameIndex};
[RequiredField]
[UIHint(UIHint.Variable)]
[Tooltip("The Array Variable source.")]
public FsmArray arraySource;
[RequiredField]
[UIHint(UIHint.Variable)]
[Tooltip("The Array Variable target.")]
public FsmArray arrayTarget;
[MatchFieldType("array")]
[Tooltip("The index to transfer.")]
public FsmInt indexToTransfer;
[ActionSection("Transfer Options")]
[ObjectType(typeof(ArrayTransferType))]
public FsmEnum copyType;
[ObjectType(typeof(ArrayPasteType))]
public FsmEnum pasteType;
[ActionSection("Result")]
[Tooltip("Event sent if this array source does not contains that element (described below)")]
public FsmEvent indexOutOfRange;
public override void Reset ()
{
arraySource = null;
arrayTarget = null;
indexToTransfer = null;
copyType = ArrayTransferType.Copy;
pasteType = ArrayPasteType.AsLastItem;
}
// Code that runs on entering the state.
public override void OnEnter ()
{
DoTransferValue ();
Finish ();
}
private void DoTransferValue ()
{
if (arraySource.IsNone || arrayTarget.IsNone)
{
return;
}
int _index = indexToTransfer.Value;
if (_index< 0 || _index>=arraySource.Length)
{
Fsm.Event(indexOutOfRange);
return;
}
var _value = arraySource.Values[_index];
if ((ArrayTransferType)copyType.Value == ArrayTransferType.Cut)
{
List<object> _list = new List<object>(arraySource.Values);
_list.RemoveAt(_index);
arraySource.Values = _list.ToArray();
}else if ((ArrayTransferType)copyType.Value == ArrayTransferType.nullify)
{
arraySource.Values.SetValue(null,_index);
}
if ( (ArrayPasteType)pasteType.Value == ArrayPasteType.AsFirstItem)
{
List<object> _listTarget = new List<object>(arrayTarget.Values);
_listTarget.Insert(0,_value);
arrayTarget.Values = _listTarget.ToArray();
}else if( (ArrayPasteType)pasteType.Value == ArrayPasteType.AsLastItem)
{
arrayTarget.Resize(arrayTarget.Length + 1);
arrayTarget.Set(arrayTarget.Length - 1, _value);
}else if( (ArrayPasteType)pasteType.Value == ArrayPasteType.InsertAtSameIndex)
{
if (_index>=arrayTarget.Length)
{
Fsm.Event(indexOutOfRange);
}
List<object> _listTarget = new List<object>(arrayTarget.Values);
_listTarget.Insert(_index,_value);
arrayTarget.Values = _listTarget.ToArray();
}else if( (ArrayPasteType)pasteType.Value == ArrayPasteType.ReplaceAtSameIndex)
{
if (_index>=arrayTarget.Length)
{
Fsm.Event(indexOutOfRange);
}else{
arrayTarget.Set(_index, _value);
}
}
}
}
}