123 lines
3.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|