2025-07-08 10:46:31 +00:00
#if PLAYMAKER_1_8_OR_NEWER
using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;
using ES3Internal ;
using HutongGames.PlayMaker.Actions ;
using HutongGames.PlayMaker ;
using System.Linq ;
using System ;
using Tooltip = HutongGames . PlayMaker . TooltipAttribute ;
public class FsmES3File : ScriptableObject
{
public ES3File file ;
}
public class FsmES3Spreadsheet : ScriptableObject
{
public ES3Spreadsheet spreadsheet ;
}
namespace ES3PlayMaker
{
#region Base Classes
public abstract class ActionBase : FsmStateAction
{
[ActionSection("Error handling")]
[Tooltip("This event is triggered if an error occurs.")]
public FsmEvent errorEvent ;
[Tooltip("If an error occurs, the error message will be stored in this variable.")]
public FsmString errorMessage ;
public abstract void Enter ( ) ;
public abstract void OnReset ( ) ;
public override void OnEnter ( )
{
try
{
Enter ( ) ;
}
catch ( System . Exception e )
{
HandleError ( e . ToString ( ) ) ;
}
Finish ( ) ;
}
public override void Reset ( )
{
errorEvent = null ;
errorMessage = "" ;
OnReset ( ) ;
}
public void HandleError ( string msg )
{
errorMessage . Value = msg ;
if ( errorEvent ! = null )
Fsm . Event ( errorEvent ) ;
else
LogError ( msg ) ;
}
}
public abstract class SettingsAction : ActionBase
{
[ActionSection("Settings")]
public FsmBool overrideDefaultSettings = false ;
[HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")]
[Tooltip("The path this ES3Settings object points to, if any.")]
public FsmString path ;
[HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")]
[ObjectType(typeof(ES3.Location))]
[Tooltip("The storage location where we wish to store data by default.")]
public FsmEnum location ;
[HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")]
[ObjectType(typeof(ES3.EncryptionType))]
[Tooltip("The type of encryption to use when encrypting data, if any.")]
public FsmEnum encryptionType ;
[HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")]
[Tooltip("The password to use to encrypt the data if encryption is enabled.")]
public FsmString encryptionPassword ;
[HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")]
[ObjectType(typeof(ES3.CompressionType))]
[Tooltip("The type of compression to use when compressing data, if any.")]
public FsmEnum compressionType ;
[HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")]
[ObjectType(typeof(ES3.Directory))]
[Tooltip("The default directory in which to store files when using the File save location, and the location which relative paths should be relative to.")]
public FsmEnum directory ;
[HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")]
[ObjectType(typeof(ES3.Format))]
[Tooltip("The format we should use when serializing and deserializing data.")]
public FsmEnum format ;
[HutongGames.PlayMaker.HideIf("DefaultSettingsOverridden")]
[Tooltip("Any stream buffers will be set to this length in bytes.")]
public FsmInt bufferSize ;
public bool DefaultSettingsOverridden ( )
{
return ! overrideDefaultSettings . Value ;
}
public override void Reset ( )
{
var settings = new ES3Settings ( ) ;
path = settings . path ;
location = settings . location ;
encryptionType = settings . encryptionType ;
compressionType = settings . compressionType ;
encryptionPassword = settings . encryptionPassword ;
directory = settings . directory ;
format = settings . format ;
bufferSize = settings . bufferSize ;
overrideDefaultSettings = false ;
base . Reset ( ) ;
}
public ES3Settings GetSettings ( )
{
var settings = new ES3Settings ( ) ;
if ( overrideDefaultSettings . Value )
{
settings . path = path . Value ;
settings . location = ( ES3 . Location ) location . Value ;
settings . encryptionType = ( ES3 . EncryptionType ) encryptionType . Value ;
settings . encryptionPassword = encryptionPassword . Value ;
settings . compressionType = ( ES3 . CompressionType ) compressionType . Value ;
settings . directory = ( ES3 . Directory ) directory . Value ;
settings . format = ( ES3 . Format ) format . Value ;
settings . bufferSize = bufferSize . Value ;
}
return settings ;
}
}
public abstract class ES3FileAction : ActionBase
{
[Tooltip("The ES3 File we are using, created using the Create ES3 File action.")]
[ObjectType(typeof(FsmES3File))]
[Title("ES3 File")]
[RequiredField]
public FsmObject fsmES3File ;
public ES3File es3File { get { return ( ( FsmES3File ) fsmES3File . Value ) . file ; } }
public override void Reset ( )
{
fsmES3File = null ;
base . Reset ( ) ;
}
}
public abstract class ES3FileSettingsAction : SettingsAction
{
[Tooltip("The ES3File variable we're using.")]
[ObjectType(typeof(FsmES3File))]
[Title("ES3 File")]
[RequiredField]
public FsmObject fsmES3File ;
public ES3File es3File { get { return ( ( FsmES3File ) fsmES3File . Value ) . file ; } }
public override void Reset ( )
{
fsmES3File = null ;
base . Reset ( ) ;
}
}
public abstract class ES3SpreadsheetAction : ActionBase
{
[Tooltip("The ES3 Spreadsheet we are using, created using the Create ES3 Spreadsheet action.")]
[ObjectType(typeof(FsmES3Spreadsheet))]
[Title("ES3 Spreadsheet")]
[RequiredField]
public FsmObject fsmES3Spreadsheet ;
public ES3Spreadsheet es3Spreadsheet { get { return ( ( FsmES3Spreadsheet ) fsmES3Spreadsheet . Value ) . spreadsheet ; } }
public override void Reset ( )
{
fsmES3Spreadsheet = null ;
base . Reset ( ) ;
}
}
public abstract class ES3SpreadsheetSettingsAction : SettingsAction
{
[Tooltip("The ES3Spreadsheet variable we're using.")]
[ObjectType(typeof(FsmES3Spreadsheet))]
[Title("ES3 Spreadsheet")]
[RequiredField]
public FsmObject fsmES3Spreadsheet ;
public ES3Spreadsheet es3Spreadsheet { get { return ( ( FsmES3Spreadsheet ) fsmES3Spreadsheet . Value ) . spreadsheet ; } }
public override void Reset ( )
{
fsmES3Spreadsheet = null ;
base . Reset ( ) ;
}
}
#endregion
#region Save Actions
[ActionCategory("Easy Save 3")]
[Tooltip("Saves the value to a file with the given key.")]
public class Save : SettingsAction
{
[Tooltip("The unique key we want to use to identity the data we are saving.")]
public FsmString key ;
[Tooltip("The value we want to save.")]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar value ;
public override void OnReset ( )
{
key = "key" ;
value = null ;
}
public override void Enter ( )
{
value . UpdateValue ( ) ;
if ( value . Type = = VariableType . Array )
ES3 . Save ( key . Value , new PMDataWrapper ( value . arrayValue . Values ) , GetSettings ( ) ) ;
else
ES3 . Save ( key . Value , value . GetValue ( ) , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Saves multiple values to a file with the given keys.")]
public class SaveMultiple : SettingsAction
{
[RequiredField]
[CompoundArray("Count", "Key", "Value")]
public FsmString [ ] keys ;
[Tooltip("The value we want to save.")]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar [ ] variables ;
public override void OnReset ( )
{
keys = null ;
variables = null ;
}
public override void Enter ( )
{
for ( int i = 0 ; i < variables . Length ; i + + )
{
var key = keys [ i ] ;
var value = variables [ i ] ;
value . UpdateValue ( ) ;
if ( value . Type = = VariableType . Array )
ES3 . Save ( key . Value , new PMDataWrapper ( value . arrayValue . Values ) , GetSettings ( ) ) ;
else
ES3 . Save ( key . Value , value . GetValue ( ) , GetSettings ( ) ) ;
}
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Saves all FsmVariables in this FSM to a file with the given key.")]
public class SaveAll : SettingsAction
{
[Tooltip("The unique key we want to use to identity the data we are saving.")]
public FsmString key ;
[Tooltip("Save the local variables accessible in this FSM?")]
public FsmBool saveFsmVariables = true ;
[Tooltip("Save the global variables accessible in all FSMs?")]
public FsmBool saveGlobalVariables = true ;
public override void OnReset ( )
{
key = "key" ;
}
public override void Enter ( )
{
ES3 . Save ( key . Value , new PMDataWrapper ( Fsm , saveFsmVariables . Value , saveGlobalVariables . Value ) , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Saves a byte array as a file, overwriting any existing files.")]
public class SaveRaw : SettingsAction
{
[Tooltip("The string we want to save as a file.")]
public FsmString str ;
[Tooltip("Whether to encode this string using Base-64 encoding. This will override any default encoding settings.")]
public FsmBool useBase64Encoding ;
[Tooltip("Adds a newline to the end of the file.")]
public FsmBool appendNewline ;
public override void OnReset ( )
{
str = "" ;
useBase64Encoding = false ;
appendNewline = false ;
}
public override void Enter ( )
{
if ( useBase64Encoding . Value )
ES3 . SaveRaw ( System . Convert . FromBase64String ( str . Value + ( appendNewline . Value ? "\n" : "" ) ) , GetSettings ( ) ) ;
else
ES3 . SaveRaw ( str . Value + ( appendNewline . Value ? "\n" : "" ) , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Appends a string to the end of a file.")]
public class AppendRaw : SettingsAction
{
[Tooltip("The string we want to append to a file.")]
public FsmString str ;
[Tooltip("Whether to encode this string using Base-64 encoding. This will override any default encoding settings.")]
public FsmBool useBase64Encoding ;
[Tooltip("If checked, a newline will be added after the data.")]
public FsmBool appendNewline ;
public override void OnReset ( )
{
str = "" ;
useBase64Encoding = false ;
appendNewline = false ;
}
public override void Enter ( )
{
if ( useBase64Encoding . Value )
ES3 . AppendRaw ( System . Convert . FromBase64String ( str . Value ) + ( appendNewline . Value ? "\n" : "" ) , GetSettings ( ) ) ;
else
ES3 . AppendRaw ( str . Value + ( appendNewline . Value ? "\n" : "" ) , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Saves a Texture2D as a PNG or a JPG, depending on the file extension of the supplied image path.")]
public class SaveImage : SettingsAction
{
[Tooltip("The relative or absolute path of the PNG or JPG file we want to store our image to.")]
public FsmString imagePath ;
[Tooltip("The Texture2D we want to save as an image.")]
[ObjectType(typeof(Texture2D))]
public FsmTexture texture2D ;
[Tooltip("The quality of the image when saving JPGs, from 1 to 100. Default is 75.")]
public FsmInt quality ;
public override void OnReset ( )
{
imagePath = "image.png" ;
texture2D = null ;
quality = 75 ;
}
public override void Enter ( )
{
ES3 . SaveImage ( ( Texture2D ) texture2D . Value , quality . Value , imagePath . Value , GetSettings ( ) ) ;
}
}
#endregion
#region Load Actions
[ActionCategory("Easy Save 3")]
[Tooltip("Loads a value from a file with the given key.")]
public class Load : SettingsAction
{
[Tooltip("The unique key which identifies the data we're loading.")]
public FsmString key ;
[Tooltip("The variable we want to use to store our loaded data.")]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar value ;
[Tooltip("Optional: A value to return if the key does not exist.")]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar defaultValue ;
public override void OnReset ( )
{
key = "key" ;
value = null ;
defaultValue = null ;
}
public override void Enter ( )
{
defaultValue . UpdateValue ( ) ;
bool useDefaultVal = defaultValue . GetValue ( ) ! = null & & ! defaultValue . IsNone ;
if ( value . Type = = VariableType . Array )
{
if ( useDefaultVal )
value . SetValue ( ES3 . Load < PMDataWrapper > ( key . Value , new PMDataWrapper ( defaultValue . arrayValue . Values ) , GetSettings ( ) ) . array ) ;
else
value . SetValue ( ES3 . Load < PMDataWrapper > ( key . Value , GetSettings ( ) ) . array ) ;
}
else
{
if ( useDefaultVal )
value . SetValue ( ES3 . Load < object > ( key . Value , defaultValue . GetValue ( ) , GetSettings ( ) ) ) ;
else
value . SetValue ( ES3 . Load < object > ( key . Value , GetSettings ( ) ) ) ;
}
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Loads multiple values from a file with the given keys.")]
public class LoadMultiple : SettingsAction
{
[RequiredField]
[CompoundArray("Count", "Key", "Value")]
public FsmString [ ] keys ;
[Tooltip("The variables we want to load into.")]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar [ ] variables ;
public override void OnReset ( )
{
keys = null ;
variables = null ;
}
public override void Enter ( )
{
for ( int i = 0 ; i < variables . Length ; i + + )
{
var key = keys [ i ] ;
var value = variables [ i ] ;
if ( value . Type = = VariableType . Array )
value . SetValue ( ES3 . Load < PMDataWrapper > ( key . Value , GetSettings ( ) ) . array ) ;
else
value . SetValue ( ES3 . Load < object > ( key . Value , GetSettings ( ) ) ) ;
}
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Loads a value from a file with the given key into an existing object, rather than creating a new instance.")]
public class LoadInto : SettingsAction
{
[Tooltip("The unique key which identifies the data we're loading.")]
public FsmString key ;
[Tooltip("The object we want to load our data into.")]
[RequiredField]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar value ;
public override void OnReset ( )
{
key = "key" ;
value = null ;
}
public override void Enter ( )
{
value . UpdateValue ( ) ;
if ( value . IsNone | | value . GetValue ( ) = = null )
HandleError ( "The 'Load Into' action requires an object to load the data into, but none was specified in the 'Value' field." ) ;
else
{
ES3 . LoadInto < object > ( key . Value , value . GetValue ( ) , GetSettings ( ) ) ;
if ( value . Type = = VariableType . Array )
HandleError ( "It's not possible to use LoadInto with arrays in PlayMaker as they are not strictly typed. Consider using Load instead." ) ;
else
value . SetValue ( ES3 . Load < object > ( key . Value , GetSettings ( ) ) ) ;
}
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Loads all FsmVariables in this FSM to a file with the given key.")]
public class LoadAll : SettingsAction
{
[Tooltip("The key we used to save the data we're loading.")]
public FsmString key ;
[Tooltip("Load the local variables accessible in this FSM?")]
public FsmBool loadFsmVariables = true ;
[Tooltip("Load the global variables accessible in all FSMs?")]
public FsmBool loadGlobalVariables = true ;
public override void OnReset ( )
{
key = "key" ;
}
public override void Enter ( )
{
ES3 . Load < PMDataWrapper > ( key . Value , GetSettings ( ) ) . ApplyVariables ( Fsm , loadFsmVariables . Value , loadGlobalVariables . Value ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Loads an entire file as a string.")]
public class LoadRawString : SettingsAction
{
[Tooltip("The variable we want to store our loaded string in.")]
public FsmString str ;
[Tooltip("Whether or not the data we're loading is Base-64 encoded. Usually this should be left unchecked.")]
public FsmBool useBase64Encoding ;
public override void OnReset ( )
{
str = null ;
useBase64Encoding = false ;
}
public override void Enter ( )
{
if ( useBase64Encoding . Value )
str . Value = System . Convert . ToBase64String ( ES3 . LoadRawBytes ( GetSettings ( ) ) ) ;
else
str . Value = ES3 . LoadRawString ( GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Loads a JPG or PNG image file as a Texture2D.")]
public class LoadImage : SettingsAction
{
[Tooltip("The relative or absolute path of the JPG or PNG image file we want to load.")]
public FsmString imagePath ;
[Tooltip("The variable we want to use to store our loaded texture.")]
public FsmTexture texture2D ;
public override void OnReset ( )
{
imagePath = "image.png" ;
texture2D = null ;
}
public override void Enter ( )
{
texture2D . Value = ES3 . LoadImage ( imagePath . Value , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Loads an audio file as an AudioClip.")]
public class LoadAudio : SettingsAction
{
[Tooltip("The relative or absolute path of the audio file we want to load.")]
public FsmString audioFilePath ;
[ObjectType(typeof(AudioClip))]
[Tooltip("The variable we want to use to store our loaded AudioClip.")]
public FsmObject audioClip ;
#if UNITY_2018_3_OR_NEWER
[Tooltip("The type of AudioClip we're loading.")]
[ObjectType(typeof(AudioType))]
public FsmEnum audioType ;
#endif
public override void OnReset ( )
{
audioFilePath = "audio.wav" ;
audioClip = null ;
#if UNITY_2018_3_OR_NEWER
audioType = AudioType . MPEG ;
#endif
}
public override void Enter ( )
{
audioClip . Value = ES3 . LoadAudio ( audioFilePath . Value ,
#if UNITY_2018_3_OR_NEWER
( AudioType ) audioType . Value ,
#endif
GetSettings ( ) ) ;
}
}
#endregion
#region Exists Actions
[ActionCategory("Easy Save 3")]
[Tooltip("Checks whether a key exists in a file.")]
public class KeyExists : SettingsAction
{
[Tooltip("The key we want to check the existence of.")]
public FsmString key ;
[Tooltip("Whether the key exists. This is set after the action runs.")]
public FsmBool exists ;
[Tooltip("This event is triggered if the key exists.")]
public FsmEvent existsEvent ;
[Tooltip("This event is triggered if the key does not exist.")]
public FsmEvent doesNotExistEvent ;
public override void OnReset ( )
{
key = "key" ;
exists = false ;
existsEvent = null ;
doesNotExistEvent = null ;
}
public override void Enter ( )
{
exists . Value = ES3 . KeyExists ( key . Value , GetSettings ( ) ) ;
Fsm . Event ( exists . Value ? existsEvent : doesNotExistEvent ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Checks whether a file exists in a directory.")]
public class FileExists : SettingsAction
{
[Tooltip("The file we want to check the existence of")]
public FsmString filePath ;
[Tooltip("Whether the file exists. This is set after the action runs.")]
public FsmBool exists ;
[Tooltip("This event is triggered if the file exists.")]
public FsmEvent existsEvent ;
[Tooltip("This event is triggered if the file does not exist.")]
public FsmEvent doesNotExistEvent ;
public override void OnReset ( )
{
filePath = "SaveFile.es3" ;
exists = false ;
existsEvent = null ;
doesNotExistEvent = null ;
}
public override void Enter ( )
{
exists . Value = ES3 . FileExists ( filePath . Value , GetSettings ( ) ) ;
Fsm . Event ( exists . Value ? existsEvent : doesNotExistEvent ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Checks whether a directory exists in another directory")]
public class DirectoryExists : SettingsAction
{
[Tooltip("The directory we want to check the existence of.")]
public FsmString directoryPath ;
[Tooltip("Whether the directory exists. This is set after the action runs.")]
public FsmBool exists ;
[Tooltip("This event is triggered if the directory exists.")]
public FsmEvent existsEvent ;
[Tooltip("This event is triggered if the directory does not exist.")]
public FsmEvent doesNotExistEvent ;
public override void OnReset ( )
{
directoryPath = "" ;
exists = false ;
existsEvent = null ;
doesNotExistEvent = null ;
}
public override void Enter ( )
{
exists . Value = ES3 . DirectoryExists ( directoryPath . Value , GetSettings ( ) ) ;
Fsm . Event ( exists . Value ? existsEvent : doesNotExistEvent ) ;
}
}
#endregion
#region Delete Actions
[ActionCategory("Easy Save 3")]
[Tooltip("Deletes a key from a file.")]
public class DeleteKey : SettingsAction
{
[Tooltip("The key we want to delete.")]
public FsmString key ;
public override void OnReset ( )
{
key = "key" ;
}
public override void Enter ( )
{
ES3 . DeleteKey ( key . Value , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Deletes a file.")]
public class DeleteFile : SettingsAction
{
[Tooltip("The relative or absolute path of the file we want to delete.")]
public FsmString filePath ;
public override void OnReset ( )
{
filePath = "SaveFile.es3" ;
}
public override void Enter ( )
{
ES3 . DeleteFile ( filePath . Value , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Deletes a directory and it's contents.")]
public class DeleteDirectory : SettingsAction
{
[Tooltip("The relative or absolute path of the directory we want to delete.")]
public FsmString directoryPath ;
public override void OnReset ( )
{
directoryPath = "" ;
}
public override void Enter ( )
{
ES3 . DeleteDirectory ( directoryPath . Value , GetSettings ( ) ) ;
}
}
#endregion
#region Backup Actions
[ActionCategory("Easy Save 3")]
[Tooltip("Creates a backup of a file which can be restored using the Restore Backup action.")]
public class CreateBackup : SettingsAction
{
[Tooltip("The relative or absolute path of the file we want to backup.")]
public FsmString filePath ;
public override void OnReset ( )
{
filePath = "SaveFile.es3" ;
}
public override void Enter ( )
{
ES3 . CreateBackup ( filePath . Value , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Restores a backup of a file created using the Create Backup action.")]
public class RestoreBackup : SettingsAction
{
[Tooltip("The relative or absolute path of the file we want to restore the backup of.")]
public FsmString filePath ;
[Tooltip("True if a backup was restored, or False if no backup could be found.")]
public FsmBool backupWasRestored ;
public override void OnReset ( )
{
filePath = "SaveFile.es3" ;
backupWasRestored = false ;
}
public override void Enter ( )
{
backupWasRestored . Value = ES3 . RestoreBackup ( filePath . Value , GetSettings ( ) ) ;
}
}
#endregion
#region Key , File and Directory Methods
[ActionCategory("Easy Save 3")]
[Tooltip("Renames a file.")]
public class RenameFile : SettingsAction
{
[Tooltip("The relative or absolute path of the file we want to rename from.")]
public FsmString oldFilePath ;
[Tooltip("The relative or absolute path of the file we want to rename to.")]
public FsmString newFilePath ;
public override void OnReset ( )
{
oldFilePath = "SaveFile.es3" ;
newFilePath = "" ;
}
public override void Enter ( )
{
ES3 . RenameFile ( oldFilePath . Value , newFilePath . Value , GetSettings ( ) , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Copies a file.")]
public class CopyFile : SettingsAction
{
[Tooltip("The relative or absolute path of the file we want to copy.")]
public FsmString oldFilePath ;
[Tooltip("The relative or absolute path of the file we want to create.")]
public FsmString newFilePath ;
public override void OnReset ( )
{
oldFilePath = "SaveFile.es3" ;
newFilePath = "" ;
}
public override void Enter ( )
{
ES3 . CopyFile ( oldFilePath . Value , newFilePath . Value , GetSettings ( ) , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Copies a directory.")]
public class CopyDirectory : SettingsAction
{
[Tooltip("The relative or absolute path of the directory we want to copy.")]
public FsmString oldDirectoryPath ;
[Tooltip("The relative or absolute path of the directory we want to create.")]
public FsmString newDirectoryPath ;
public override void OnReset ( )
{
oldDirectoryPath = "" ;
newDirectoryPath = "" ;
}
public override void Enter ( )
{
ES3 . CopyDirectory ( oldDirectoryPath . Value , newDirectoryPath . Value , GetSettings ( ) , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Gets an array of key names from a file.")]
public class GetKeys : SettingsAction
{
[Tooltip("The relative or absolute path of the file we want to get the keys from.")]
public FsmString filePath ;
[Tooltip("The string array variable we want to load our key names into.")]
[ArrayEditor(VariableType.String)]
public FsmArray keys ;
public override void OnReset ( )
{
filePath = "SaveFile.es3" ;
keys = null ;
}
public override void Enter ( )
{
keys . Values = ES3 . GetKeys ( filePath . Value , GetSettings ( ) ) ;
keys . SaveChanges ( ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Gets how many keys are in a file.")]
public class GetKeyCount : SettingsAction
{
[Tooltip("The relative or absolute path of the file we want to count the keys of.")]
public FsmString filePath ;
[Tooltip("The int variable we want to load our count into.")]
public FsmInt keyCount ;
public override void OnReset ( )
{
filePath = "SaveFile.es3" ;
keyCount = null ;
}
public override void Enter ( )
{
keyCount . Value = ES3 . GetKeys ( filePath . Value , GetSettings ( ) ) . Length ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Gets the names of the files in a given directory.")]
public class GetFiles : SettingsAction
{
[Tooltip("The relative or absolute path of the directory we want to get the file names from.")]
public FsmString directoryPath ;
[Tooltip("The string array variable we want to load our file names into.")]
[ArrayEditor(VariableType.String)]
public FsmArray files ;
public override void OnReset ( )
{
directoryPath = "" ;
files = null ;
}
public override void Enter ( )
{
files . Values = ES3 . GetFiles ( directoryPath . Value , GetSettings ( ) ) ;
files . SaveChanges ( ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Gets the names of any directories in a given directory.")]
public class GetDirectories : SettingsAction
{
[Tooltip("The relative or absolute path of the directory we want to get the directory names from.")]
public FsmString directoryPath ;
[Tooltip("The string array variable we want to load our directory names into.")]
[ArrayEditor(VariableType.String)]
public FsmArray directories ;
public override void OnReset ( )
{
directoryPath = "" ;
directories = null ;
}
public override void Enter ( )
{
directories . Values = ES3 . GetDirectories ( directoryPath . Value , GetSettings ( ) ) ;
directories . SaveChanges ( ) ;
}
}
#endregion
#region ES3Spreadsheet Actions
[ActionCategory("Easy Save 3")]
[Tooltip("Creates a new empty ES3Spreadsheet.")]
public class ES3SpreadsheetCreate : ES3SpreadsheetAction
{
public override void OnReset ( )
{
}
public override void Enter ( )
{
var spreadsheet = ScriptableObject . CreateInstance < FsmES3Spreadsheet > ( ) ;
spreadsheet . spreadsheet = new ES3Spreadsheet ( ) ;
fsmES3Spreadsheet . Value = spreadsheet ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Sets a given cell of the ES3Spreadsheet to the value provided.")]
public class ES3SpreadsheetSetCell : ES3SpreadsheetAction
{
[Tooltip("The column of the cell we want to set the value of.")]
public FsmInt col ;
[Tooltip("The row of the cell we want to set the value of.")]
public FsmInt row ;
[Tooltip("The value we want to save.")]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar value ;
public override void OnReset ( )
{
value = null ;
}
public override void Enter ( )
{
value . UpdateValue ( ) ;
es3Spreadsheet . SetCell ( col . Value , row . Value , value . GetValue ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Gets a given cell of the ES3Spreadsheet and loads it into the value field.")]
public class ES3SpreadsheetGetCell : ES3SpreadsheetAction
{
[Tooltip("The column of the cell we want to set the value of.")]
public FsmInt col ;
[Tooltip("The row of the cell we want to set the value of.")]
public FsmInt row ;
[Tooltip("The value we want to save.")]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar value ;
public override void OnReset ( )
{
value = null ;
}
public override void Enter ( )
{
value . SetValue ( es3Spreadsheet . GetCell ( value . RealType , col . Value , row . Value ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Saves the ES3Spreadsheet to file.")]
public class ES3SpreadsheetSave : ES3SpreadsheetSettingsAction
{
[Tooltip("The filename or path we want to use to save the spreadsheet.")]
public FsmString filePath ;
[Tooltip("Whether we want to append this spreadsheet to an existing spreadsheet if one already exists.")]
public FsmBool append ;
public override void OnReset ( )
{
filePath = "ES3.csv" ;
append = false ;
}
public override void Enter ( )
{
es3Spreadsheet . Save ( filePath . Value , GetSettings ( ) , append . Value ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Loads a a spreadsheet from a file into this ES3Spreadsheet.")]
public class ES3SpreadsheetLoad : ES3SpreadsheetSettingsAction
{
[Tooltip("The filename or path we want to use to save the spreadsheet.")]
public FsmString filePath ;
public override void OnReset ( )
{
filePath = "ES3.csv" ;
}
public override void Enter ( )
{
es3Spreadsheet . Load ( filePath . Value , GetSettings ( ) ) ;
}
}
#endregion
#region ES3File Actions
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Creates a new ES3File, and optionally loads a file from storage into it.")]
public class ES3FileCreate : ES3FileSettingsAction
{
[Tooltip("The relative or absolute path of the file this ES3File represents in storage.")]
public FsmString filePath ;
[Tooltip("Whether we should sync this ES3File with the one in storage immediately after creating it.")]
public FsmBool syncWithFile ;
public override void OnReset ( )
{
filePath = "SaveFile.es3" ;
syncWithFile = true ;
}
public override void Enter ( )
{
var file = ScriptableObject . CreateInstance < FsmES3File > ( ) ;
file . file = new ES3File ( filePath . Value , GetSettings ( ) , syncWithFile . Value ) ;
fsmES3File . Value = file ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Synchronises this ES3File with a file in storage.")]
public class ES3FileSync : ES3FileSettingsAction
{
[Tooltip("The relative or absolute path of the file we want to synchronise with in storage.")]
public FsmString filePath ;
public override void OnReset ( )
{
filePath = "SaveFile.es3" ;
}
public override void Enter ( )
{
if ( overrideDefaultSettings . Value )
es3File . Sync ( GetSettings ( ) ) ;
else
es3File . Sync ( ) ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Saves the value to the ES3File with the given key.")]
public class ES3FileSave : ES3FileAction
{
[Tooltip("The unique key we want to use to identity the data we are saving.")]
public FsmString key ;
[Tooltip("The value we want to save.")]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar value ;
public override void OnReset ( )
{
key = "key" ;
value = null ;
}
public override void Enter ( )
{
value . UpdateValue ( ) ;
es3File . Save ( key . Value , value . GetValue ( ) ) ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Loads a value with the given key from the ES3File")]
public class ES3FileLoad : ES3FileAction
{
[Tooltip("The unique key which identifies the data we're loading.")]
public FsmString key ;
[Tooltip("The variable we want to use to store our loaded data.")]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar value ;
[Tooltip("Optional: A value to return if the key does not exist.")]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar defaultValue ;
public override void OnReset ( )
{
key = "key" ;
value = null ;
defaultValue = null ;
}
public override void Enter ( )
{
defaultValue . UpdateValue ( ) ;
if ( defaultValue . GetValue ( ) ! = null & & ! defaultValue . IsNone )
value . SetValue ( es3File . Load < object > ( key . Value , defaultValue . GetValue ( ) ) ) ;
else
value . SetValue ( es3File . Load < object > ( key . Value ) ) ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Loads a value with the given key from the ES3File into an existing object")]
public class ES3FileLoadInto : ES3FileAction
{
[Tooltip("The unique key which identifies the data we're loading.")]
public FsmString key ;
[Tooltip("The variable we want to load our data into.")]
[UIHint(UIHint.Variable)]
[HideTypeFilter]
public FsmVar value ;
public override void OnReset ( )
{
key = "key" ;
value = null ;
}
public override void Enter ( )
{
value . UpdateValue ( ) ;
es3File . LoadInto < object > ( key . Value , value . GetValue ( ) ) ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Loads the entire ES3 File as a string")]
public class ES3FileLoadRawString : ES3FileAction
{
[Tooltip("The FsmArray variable we want to use to store our string representing the file.")]
public FsmString str ;
[Tooltip("Whether or not the data we're loading is Base-64 encoded. Usually this should be left unchecked.")]
public FsmBool useBase64Encoding ;
public override void OnReset ( )
{
str = null ;
useBase64Encoding = false ;
}
public override void Enter ( )
{
if ( useBase64Encoding . Value )
str . Value = System . Convert . ToBase64String ( es3File . LoadRawBytes ( ) ) ;
else
str . Value = es3File . LoadRawString ( ) ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Deletes a key from an ES3 File.")]
public class ES3FileDeleteKey : ES3FileAction
{
[Tooltip("The key we want to delete.")]
public FsmString key ;
public override void OnReset ( )
{
key = "key" ;
}
public override void Enter ( )
{
es3File . DeleteKey ( key . Value ) ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Checks whether a key exists in an ES3File.")]
public class ES3FileKeyExists : ES3FileAction
{
[Tooltip("The key we want to check the existence of.")]
public FsmString key ;
[Tooltip("Whether the key exists. This is set after the action runs.")]
public FsmBool exists ;
[Tooltip("This event is triggered if the key exists.")]
public FsmEvent existsEvent ;
[Tooltip("This event is triggered if the key does not exist.")]
public FsmEvent doesNotExistEvent ;
public override void OnReset ( )
{
key = "key" ;
exists = false ;
existsEvent = null ;
doesNotExistEvent = null ;
}
public override void Enter ( )
{
exists . Value = es3File . KeyExists ( key . Value ) ;
if ( exists . Value & & existsEvent ! = null )
Fsm . Event ( existsEvent ) ;
else if ( doesNotExistEvent ! = null )
Fsm . Event ( doesNotExistEvent ) ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Gets an array of key names from an ES3File.")]
public class ES3FileGetKeys : ES3FileAction
{
[Tooltip("The string array variable we want to load our key names into.")]
[ArrayEditor(VariableType.String)]
public FsmArray keys ;
public override void OnReset ( )
{
keys = null ;
}
public override void Enter ( )
{
keys . Values = es3File . GetKeys ( ) ;
keys . SaveChanges ( ) ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Clears all keys from an ES3File.")]
public class ES3FileClear : ES3FileAction
{
public override void OnReset ( ) { }
public override void Enter ( )
{
es3File . Clear ( ) ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Gets an array of key names from a file.")]
public class ES3FileSize : ES3FileAction
{
[Tooltip("The variable we want to put the file size into.")]
public FsmInt size ;
public override void OnReset ( )
{
size = 0 ;
}
public override void Enter ( )
{
size . Value = es3File . Size ( ) ;
}
}
#endregion
#region ES3Cloud Actions
#if ! DISABLE_WEB
public abstract class ES3CloudAction : SettingsAction
{
[Tooltip("The URL to the ES3Cloud.php file on your server.")]
[RequiredField]
public FsmString url ;
[Tooltip("The API key generated when installing ES3 Cloud on your server.")]
[RequiredField]
public FsmString apiKey ;
[Tooltip("The ES3File variable we're using.")]
[ObjectType(typeof(FsmES3File))]
[Title("ES3 File")]
[RequiredField]
public FsmObject fsmES3File ;
public ES3File es3File { get { return ( ( FsmES3File ) fsmES3File . Value ) . file ; } }
[Tooltip("An error code if an error occurred.")]
public FsmInt errorCode ;
protected ES3Cloud cloud = null ;
public override void OnReset ( )
{
url = "http://www.myserver.com/ES3Cloud.php" ;
errorCode = 0 ;
cloud = null ;
fsmES3File = null ;
}
public override void OnEnter ( )
{
try
{
CreateES3Cloud ( ) ;
Enter ( ) ;
}
catch ( System . Exception e )
{
HandleError ( e . ToString ( ) ) ;
}
}
public override void OnUpdate ( )
{
base . OnUpdate ( ) ;
if ( cloud . isDone )
{
if ( cloud . isError )
{
errorCode . Value = ( int ) cloud . errorCode ;
errorMessage . Value = cloud . error ;
Log ( "Error occurred when trying to perform operation with ES3Cloud: [Error " + cloud . errorCode + "] " + cloud . error ) ;
Fsm . Event ( errorEvent ) ;
}
else
Finish ( ) ;
}
}
protected void CreateES3Cloud ( )
{
cloud = new ES3Cloud ( url . Value , apiKey . Value ) ;
}
}
public abstract class ES3CloudUserAction : ES3CloudAction
{
[ActionSection("User (optional)")]
public FsmString user ;
public FsmString password ;
public override void OnReset ( )
{
base . OnReset ( ) ;
user = "" ;
password = "" ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Synchronises a file in storage with the server.")]
public class ES3CloudSync : ES3CloudUserAction
{
public override void Enter ( )
{
var settings = GetSettings ( ) ;
StartCoroutine ( cloud . Sync ( path . Value , settings ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Uploads a file in storage to the server, overwriting any existing files.")]
public class ES3CloudUploadFile : ES3CloudUserAction
{
public override void Enter ( )
{
var settings = GetSettings ( ) ;
StartCoroutine ( cloud . UploadFile ( path . Value , user . Value , password . Value , settings ) ) ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Uploads a file in storage to the server, overwriting any existing files.")]
public class ES3CloudUploadES3File : ES3CloudUserAction
{
public override void Enter ( )
{
var settings = GetSettings ( ) ;
StartCoroutine ( cloud . UploadFile ( es3File , user . Value , password . Value ) ) ;
}
}
[ActionCategory("Deprecated Easy Save 3 actions")]
[Tooltip("Downloads a file from the server, overwriting any existing files, or returning error code 3 if no file exists on the server.")]
public class ES3CloudDownloadES3File : ES3CloudUserAction
{
public override void Enter ( )
{
var settings = GetSettings ( ) ;
StartCoroutine ( cloud . DownloadFile ( es3File , user . Value , password . Value ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Downloads a file from the server into an file, or returning error code 3 if no file exists on the server.")]
public class ES3CloudDownloadFile : ES3CloudUserAction
{
public override void Enter ( )
{
var settings = GetSettings ( ) ;
StartCoroutine ( cloud . DownloadFile ( path . Value , user . Value , password . Value , settings ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Downloads a file from the server, overwriting any existing files, or returning error code 3 if no file exists on the server.")]
public class ES3CloudDeleteFile : ES3CloudUserAction
{
public override void Enter ( )
{
var settings = GetSettings ( ) ;
StartCoroutine ( cloud . DeleteFile ( path . Value , user . Value , password . Value , settings ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Renames a file on the server, overwriting any existing files, or returning error code 3 if no file exists on the server.")]
public class ES3CloudRenameFile : ES3CloudUserAction
{
[Tooltip("The name we want to rename the file to.")]
public FsmString newFilename ;
public override void Enter ( )
{
var settings = GetSettings ( ) ;
StartCoroutine ( cloud . RenameFile ( path . Value , newFilename . Value , user . Value , password . Value , settings ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Downloads the names of all of the files on the server for the given user.")]
public class ES3CloudDownloadFilenames : ES3CloudUserAction
{
[Tooltip("The string array variable we want to load our file names into.")]
[ArrayEditor(VariableType.String)]
public FsmArray filenames ;
[Tooltip("An optional search pattern containing '%' or '_' wildcards where '%' represents zero, one, or multiple characters, and '_' represents a single character. See https://www.w3schools.com/sql/sql_like.asp for more info.")]
public FsmString searchPattern ;
public override void OnReset ( )
{
filenames = null ;
searchPattern = "" ;
}
public override void Enter ( )
{
StartCoroutine ( cloud . SearchFilenames ( string . IsNullOrEmpty ( searchPattern . Value ) ? "%" : searchPattern . Value , user . Value , password . Value ) ) ;
}
public override void OnUpdate ( )
{
if ( cloud ! = null & & cloud . isDone )
{
var downloadedFilenames = cloud . filenames ;
filenames . Resize ( cloud . filenames . Length ) ;
for ( int i = 0 ; i < downloadedFilenames . Length ; i + + )
filenames . Set ( i , downloadedFilenames [ i ] ) ;
filenames . SaveChanges ( ) ;
}
base . OnUpdate ( ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Downloads the names of all of the files on the server for the given user.")]
public class ES3CloudSearchFilenames : ES3CloudUserAction
{
[Tooltip("The string array variable we want to load our file names into.")]
[ArrayEditor(VariableType.String)]
public FsmArray filenames ;
[Tooltip("An optional search pattern containing '%' or '_' wildcards where '%' represents zero, one, or multiple characters, and '_' represents a single character. See https://www.w3schools.com/sql/sql_like.asp for more info.")]
public FsmString searchPattern ;
public override void OnReset ( )
{
filenames = null ;
searchPattern = "" ;
}
public override void Enter ( )
{
StartCoroutine ( cloud . SearchFilenames ( string . IsNullOrEmpty ( searchPattern . Value ) ? "%" : searchPattern . Value , user . Value , password . Value ) ) ;
}
public override void OnUpdate ( )
{
if ( cloud ! = null & & cloud . isDone )
{
var downloadedFilenames = cloud . filenames ;
filenames . Resize ( cloud . filenames . Length ) ;
for ( int i = 0 ; i < downloadedFilenames . Length ; i + + )
filenames . Set ( i , downloadedFilenames [ i ] ) ;
filenames . SaveChanges ( ) ;
}
base . OnUpdate ( ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Determines when a file was last updated.")]
public class ES3CloudDownloadTimestamp : ES3CloudUserAction
{
[Tooltip("The Date and time the file was last updated, as a string formatted as yyyy-MM-ddTHH:mm:ss.")]
public FsmString timestamp ;
public override void OnReset ( )
{
timestamp = "" ;
}
public override void Enter ( )
{
StartCoroutine ( cloud . DownloadTimestamp ( path . Value , user . Value , password . Value ) ) ;
}
public override void OnUpdate ( )
{
if ( cloud ! = null & & cloud . isDone )
timestamp . Value = cloud . timestamp . ToString ( "s" ) ;
base . OnUpdate ( ) ;
}
}
#endif
#endregion
#region ES3AutoSave actions
[ActionCategory("Easy Save 3")]
[Tooltip("Triggers Auto Save's Save method.")]
public class ES3AutoSaveSave : FsmStateAction
{
public override void OnEnter ( )
{
GameObject . Find ( "Easy Save 3 Manager" ) . GetComponent < ES3AutoSaveMgr > ( ) . Save ( ) ;
Finish ( ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Triggers Auto Save's Load method.")]
public class ES3AutoSaveLoad : FsmStateAction
{
public override void OnEnter ( )
{
GameObject . Find ( "Easy Save 3 Manager" ) . GetComponent < ES3AutoSaveMgr > ( ) . Load ( ) ;
Finish ( ) ;
}
}
#endregion
#region ES3Cache actions
[ActionCategory("Easy Save 3")]
[Tooltip("Caches a locally-stored file into memory.")]
public class CacheFile : SettingsAction
{
[Tooltip("The filename or file path of the file we want to cache.")]
public FsmString filePath ;
public override void OnReset ( )
{
filePath = "SaveFile.es3" ;
}
public override void Enter ( )
{
ES3 . CacheFile ( filePath . Value , GetSettings ( ) ) ;
}
}
[ActionCategory("Easy Save 3")]
[Tooltip("Stores a file in the cache to a local file.")]
public class StoreCachedFile : SettingsAction
{
[Tooltip("The filename or file path of the file we want to store.")]
public FsmString filePath ;
public override void OnReset ( )
{
filePath = "SaveFile.es3" ;
}
public override void Enter ( )
{
ES3 . StoreCachedFile ( filePath . Value , GetSettings ( ) ) ;
}
}
#endregion
#region Misc actions
[ActionCategory("Easy Save 3")]
[Tooltip("Gets the Streaming Assets path (see https://docs.unity3d.com/Manual/StreamingAssets.html), and optionally appends onto it. It is strongly recommended to use Easy Save's default of Persistent Data Path instead as this works on all platforms.")]
public class GetStreamingAssetsPath : FsmStateAction
{
[Tooltip("The variable we want to output the Streaming Assets path to.")]
public FsmString output ;
[Tooltip("[Optional] A string to append to the path , for example a filename . A forward slash is automatically added for you . ")]
public FsmString append ;
public override void Reset ( )
{
output = null ;
append = null ;
}
public override void OnEnter ( )
{
if ( ! string . IsNullOrEmpty ( append . Value ) )
output . Value = Application . streamingAssetsPath + "/" + append . Value ;
else
output . Value = Application . streamingAssetsPath ;
Finish ( ) ;
}
}
#endregion
public class PMDataWrapper
{
public Dictionary < string , object > objs = null ;
public Dictionary < string , object [ ] > arrays = null ;
public object obj = null ;
public object [ ] array = null ;
public PMDataWrapper ( Fsm fsm , bool fsmVariables , bool globalVariables )
{
objs = new Dictionary < string , object > ( ) ;
arrays = new Dictionary < string , object [ ] > ( ) ;
if ( fsm = = null )
return ;
// Get FSMVariables objects required based on whether the user wants to save local variables, global variables or both.
var variableLists = new List < FsmVariables > ( ) ;
if ( fsmVariables )
variableLists . Add ( fsm . Variables ) ;
if ( globalVariables )
variableLists . Add ( FsmVariables . GlobalVariables ) ;
foreach ( var variableList in variableLists )
{
foreach ( var fsmVariable in variableList . GetAllNamedVariables ( ) )
{
if ( string . IsNullOrEmpty ( fsmVariable . Name ) )
continue ;
if ( fsmVariable . GetType ( ) = = typeof ( FsmArray ) )
arrays . Add ( fsmVariable . Name , ( ( FsmArray ) fsmVariable ) . Values ) ;
else
objs . Add ( fsmVariable . Name , fsmVariable . RawValue ) ;
}
}
}
public PMDataWrapper ( Dictionary < string , object > objs , Dictionary < string , object [ ] > arrays )
{
this . objs = objs ;
this . arrays = arrays ;
}
public PMDataWrapper ( object obj )
{
this . obj = obj ;
}
public PMDataWrapper ( object [ ] array )
{
this . array = array ;
}
public PMDataWrapper ( ) { }
public void ApplyVariables ( Fsm fsm , bool fsmVariables , bool globalVariables )
{
// Get FSMVariables objects required based on whether the user wants to save local variables, global variables or both.
var variableLists = new List < FsmVariables > ( ) ;
if ( fsmVariables )
variableLists . Add ( fsm . Variables ) ;
if ( globalVariables )
variableLists . Add ( FsmVariables . GlobalVariables ) ;
foreach ( var variableList in variableLists )
{
foreach ( var fsmVariable in variableList . GetAllNamedVariables ( ) )
{
if ( fsmVariable . GetType ( ) = = typeof ( FsmArray ) )
{
if ( arrays . ContainsKey ( fsmVariable . Name ) )
( ( FsmArray ) fsmVariable ) . Values = arrays [ fsmVariable . Name ] ;
}
else
{
if ( objs . ContainsKey ( fsmVariable . Name ) )
fsmVariable . RawValue = objs [ fsmVariable . Name ] ;
}
}
}
}
}
}
namespace ES3Types
{
[UnityEngine.Scripting.Preserve]
[ES3Properties("objs", "arrays", "obj", "array")]
public class ES3Type_PMDataWrapper : ES3ObjectType
{
public static ES3Type Instance = null ;
public ES3Type_PMDataWrapper ( ) : base ( typeof ( ES3PlayMaker . PMDataWrapper ) ) { Instance = this ; priority = 1 ; }
protected override void WriteObject ( object obj , ES3Writer writer )
{
var instance = ( ES3PlayMaker . PMDataWrapper ) obj ;
writer . WriteProperty ( "objs" , instance . objs ) ;
writer . WriteProperty ( "arrays" , instance . arrays ) ;
writer . WriteProperty ( "obj" , instance . obj ) ;
writer . WriteProperty ( "array" , instance . array ) ;
}
protected override void ReadObject < T > ( ES3Reader reader , object obj )
{
var instance = ( ES3PlayMaker . PMDataWrapper ) obj ;
foreach ( string propertyName in reader . Properties )
{
switch ( propertyName )
{
case "objs" :
instance . objs = reader . Read < System . Collections . Generic . Dictionary < System . String , System . Object > > ( ) ;
break ;
case "arrays" :
instance . arrays = reader . Read < System . Collections . Generic . Dictionary < System . String , System . Object [ ] > > ( ) ;
break ;
case "obj" :
instance . obj = reader . Read < System . Object > ( ) ;
break ;
case "array" :
instance . array = reader . Read < System . Object [ ] > ( ) ;
break ;
default :
reader . Skip ( ) ;
break ;
}
}
}
protected override object ReadObject < T > ( ES3Reader reader )
{
var instance = new ES3PlayMaker . PMDataWrapper ( ) ;
ReadObject < T > ( reader , instance ) ;
return instance ;
}
}
[UnityEngine.Scripting.Preserve]
[ES3Properties("ActiveStateName")]
public class ES3Type_Fsm : ES3ObjectType
{
public static ES3Type Instance = null ;
public ES3Type_Fsm ( ) : base ( typeof ( Fsm ) ) { Instance = this ; priority = 1 ; }
protected override void WriteObject ( object obj , ES3Writer writer )
{
var instance = ( Fsm ) obj ;
writer . WriteProperty ( "ActiveStateName" , instance . ActiveStateName , ES3Type_string . Instance ) ;
writer . WriteProperty ( "Variables" , new ES3PlayMaker . PMDataWrapper ( instance , true , false ) , ES3Type_PMDataWrapper . Instance ) ;
}
protected override void ReadObject < T > ( ES3Reader reader , object obj )
{
var instance = ( Fsm ) obj ;
if ( ! instance . Initialized )
{
// Toggle FSM Component twice to trigger initialisation.
instance . FsmComponent . enabled = ! instance . FsmComponent . enabled ;
instance . FsmComponent . enabled = ! instance . FsmComponent . enabled ;
}
foreach ( string propertyName in reader . Properties )
{
switch ( propertyName )
{
case "ActiveStateName" :
instance . SetState ( reader . Read < string > ( ES3Type_string . Instance ) ) ;
break ;
case "Variables" :
reader . Read < ES3PlayMaker . PMDataWrapper > ( ES3Type_PMDataWrapper . Instance ) . ApplyVariables ( instance , true , false ) ;
break ;
}
}
}
protected override object ReadObject < T > ( ES3Reader reader )
{
var instance = new HutongGames . PlayMaker . Fsm ( ) ;
ReadObject < T > ( reader , instance ) ;
return instance ;
}
}
/ * [ UnityEngine . Scripting . Preserve ]
[ES3Properties("Fsm")]
public class ES3Type_PlayMakerFSM : ES3ComponentType
{
public static ES3Type Instance = null ;
public ES3Type_PlayMakerFSM ( ) : base ( typeof ( PlayMakerFSM ) )
{
Instance = this ;
priority = 1 ;
}
protected override void WriteComponent ( object obj , ES3Writer writer )
{
var instance = ( PlayMakerFSM ) obj ;
writer . WriteProperty ( "enabled" , instance . enabled ) ;
writer . WriteProperty ( "Fsm" , instance . Fsm , ES3Type_Fsm . Instance ) ;
}
protected override void ReadComponent < T > ( ES3Reader reader , object obj )
{
var instance = ( PlayMakerFSM ) obj ;
foreach ( string propertyName in reader . Properties )
{
switch ( propertyName )
{
case "enabled" :
instance . enabled = reader . Read < bool > ( ES3Type_bool . Instance ) ;
break ;
case "Fsm" :
reader . ReadInto < Fsm > ( instance . Fsm ) ;
break ;
default :
reader . Skip ( ) ;
break ;
}
}
}
} * /
}
#endif