using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Media;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using GlobalEnums;
using HarmonyLib;
using HutongGames.PlayMaker;
using Snapshot;
using Snapshot_SilkSong.BattleState;
using Snapshot_SilkSong.BossState;
using Snapshot_SilkSong.CocoonState;
using Snapshot_SilkSong.EnemyState;
using Snapshot_SilkSong.PlayerState;
using Snapshot_SilkSong.SceneState;
using Snapshot_SilkSong.States;
using Snapshot_SilkSong.Utils;
using Snapshot_SilkSong.Utils.Snapshot_SilkSong.Patches;
using UnityEngine;
using UnityEngine.SceneManagement;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Snapshot-SilkSong")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Snapshot-SilkSong")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("f85d419e-1185-482b-b0ea-8b3437cbf87b")]
[assembly: AssemblyFileVersion("1.3.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.3.0.0")]
public static class DeepCopier
{
public static T DeepCopy<T>(T obj)
{
if (obj == null)
{
return default(T);
}
if (obj.GetType().IsValueType || obj is string)
{
return obj;
}
try
{
using MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
((IFormatter)binaryFormatter).Serialize((Stream)memoryStream, (object)obj);
memoryStream.Seek(0L, SeekOrigin.Begin);
return (T)((IFormatter)binaryFormatter).Deserialize((Stream)memoryStream);
}
catch (Exception ex)
{
throw new InvalidOperationException("Deep Copy failed: " + ex.Message, ex);
}
}
}
namespace Snapshot
{
public class MemorySnapshot
{
public PlayerState playerState;
public SceneState sceneState;
public EnemyState enemyState;
public BattleState battleState;
public PersistentState persistentState;
public BossState bossState;
public CocoonState cocoonState;
public bool isActive;
public DateTime timestamp;
public MemorySnapshot()
{
playerState = new PlayerState();
sceneState = new SceneState();
enemyState = new EnemyState();
battleState = new BattleState();
persistentState = new PersistentState();
bossState = new BossState();
cocoonState = new CocoonState();
isActive = false;
timestamp = DateTime.Now;
}
}
public class Manager
{
[CompilerGenerated]
private sealed class <EnableFsmAfterDelay>d__4 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <EnableFsmAfterDelay>d__4(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(0.5f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
StateController.IsFsmEnabled = true;
return false;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <LoadCoroutine>d__6 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Manager <>4__this;
public string slotName;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <LoadCoroutine>d__6(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
//IL_0157: Expected O, but got Unknown
int num = <>1__state;
Manager manager = <>4__this;
switch (num)
{
default:
return false;
case 0:
<>1__state = -1;
manager.loadCoroutineRunning = true;
Debug.Log((object)"Start to load the Snapshot");
StateController.IsFsmEnabled = false;
<>2__current = SceneState.LoadSceneStateCoroutine(manager.snapshots[slotName].sceneState);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
PlayerState.LoadPlayerState(manager.snapshots[slotName].playerState);
CocoonState.LoadCocoonState(manager.snapshots[slotName].cocoonState, slotName);
BossState.LoadBossState(manager.snapshots[slotName].bossState, slotName);
BattleState.LoadBattleState(manager.snapshots[slotName].battleState, slotName);
EnemyState.LoadEnemyState(manager.snapshots[slotName].enemyState, slotName);
PersistentState.LoadPersistentState(manager.snapshots[slotName].persistentState, slotName);
FSMState.LoadFSMState(manager.snapshots[slotName]);
<>2__current = (object)new WaitForSeconds(0.1f);
<>1__state = 2;
return true;
case 2:
<>1__state = -1;
StateController.IsFsmEnabled = true;
manager.loadCoroutineRunning = false;
ToolItemManager.SendEquippedChangedEvent(true);
HeroController.instance.AddGeo(0);
HeroController.instance.AddShards(0);
HeroController.instance.AddSilk(0, false);
HeroController.instance.AddHealth(0);
Debug.Log((object)"Over loaded");
return false;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private bool loadCoroutineRunning;
private Dictionary<string, MemorySnapshot> snapshots;
public Manager()
{
snapshots = new Dictionary<string, MemorySnapshot>();
}
public void Save(string slotName)
{
Debug.Log((object)"Start to save the Snapshot");
StateController.IsFsmEnabled = false;
ObjectFinder.EnsureDontDestroyOnLoadObject("", slotName);
Debug.Log((object)slotName);
try
{
if (!snapshots.ContainsKey(slotName))
{
snapshots[slotName] = new MemorySnapshot();
}
PlayerState.SavePlayerState(snapshots[slotName].playerState);
SceneState.SaveSceneState(snapshots[slotName].sceneState);
CocoonState.SaveCocoonState(snapshots[slotName].cocoonState, slotName);
BossState.SaveBossState(snapshots[slotName].bossState, slotName);
BattleState.SaveBattleState(snapshots[slotName].battleState, slotName);
EnemyState.SaveEnemyState(snapshots[slotName].enemyState, slotName);
PersistentState.SavePersistentState(snapshots[slotName].persistentState, slotName);
FSMState.SaveFSMState(snapshots[slotName]);
snapshots[slotName].isActive = true;
snapshots[slotName].timestamp = DateTime.Now;
}
catch (Exception ex)
{
Debug.LogError((object)("Failed to save game state: " + ex.Message));
}
((MonoBehaviour)GameManager.instance).StartCoroutine(EnableFsmAfterDelay());
Debug.Log((object)"Over saved");
}
[IteratorStateMachine(typeof(<EnableFsmAfterDelay>d__4))]
private IEnumerator EnableFsmAfterDelay()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <EnableFsmAfterDelay>d__4(0);
}
public void Load(string slotName)
{
if (!loadCoroutineRunning && snapshots.ContainsKey(slotName) && snapshots[slotName].isActive)
{
((MonoBehaviour)GameManager.instance).StartCoroutine(LoadCoroutine(slotName));
}
}
[IteratorStateMachine(typeof(<LoadCoroutine>d__6))]
private IEnumerator LoadCoroutine(string slotName)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <LoadCoroutine>d__6(0)
{
<>4__this = this,
slotName = slotName
};
}
}
[Serializable]
[BepInPlugin("Lingkong.Snapshot.SilkSong", "Silk Sogn Shapshot", "1.3.0.0")]
public class Snapshot : BaseUnityPlugin
{
private static Manager manager;
private ConfigManagers configManager;
private void Awake()
{
Harmony.CreateAndPatchAll(typeof(Snapshot), (string)null);
Harmony.CreateAndPatchAll(typeof(Manager), (string)null);
Harmony.CreateAndPatchAll(typeof(StatePatches), (string)null);
configManager = new ConfigManagers();
}
private void Start()
{
manager = new Manager();
((BaseUnityPlugin)this).Logger.LogInfo((object)"Snapshot Plugin Loaded.");
}
private void Update()
{
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
foreach (ConfigManagers.HotkeySlot value in configManager.slots.Values)
{
if (configManager.CheckHotkey(value.SaveKey, value.SaveKeyCtrlModifier))
{
SaveSnapshot(value.SlotName);
}
if (configManager.CheckHotkey(value.LoadKey, value.LoadKeyCtrlModifier))
{
LoadSnapshot(value.SlotName);
}
}
}
private void SaveSnapshot(string slot)
{
manager.Save(slot);
((BaseUnityPlugin)this).Logger.LogInfo((object)("Saved snapshot to slot " + slot));
if (configManager.PlaySoundOnSave)
{
SystemSounds.Beep.Play();
}
}
private void LoadSnapshot(string slot)
{
manager.Load(slot);
((BaseUnityPlugin)this).Logger.LogInfo((object)("Loaded snapshot from slot " + slot));
if (configManager.PlaySoundOnLoad)
{
SystemSounds.Beep.Play();
}
}
}
}
namespace Snapshot_SilkSong.SceneState
{
public class SceneState
{
[CompilerGenerated]
private sealed class <LoadSceneStateCoroutine>d__4 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public SceneState sceneState;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <LoadSceneStateCoroutine>d__4(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
switch (<>1__state)
{
default:
return false;
case 0:
{
<>1__state = -1;
GameManager instance = GameManager.instance;
HeroController instance2 = HeroController.instance;
if ((Object)(object)instance2 == (Object)null || (Object)(object)instance == (Object)null || sceneState == null)
{
Debug.LogError((object)"Failed to teleport: Data Null");
return false;
}
if (instance.sceneName != sceneState.currentScene)
{
<>2__current = WaitForSceneLoadAndTeleport(sceneState.currentScene, sceneState.position);
<>1__state = 1;
return true;
}
((Component)instance2).transform.position = sceneState.position;
<>2__current = null;
<>1__state = 2;
return true;
}
case 1:
<>1__state = -1;
break;
case 2:
<>1__state = -1;
break;
}
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <WaitForSceneLoadAndTeleport>d__5 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public string targetScene;
public Vector3 targetPosition;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <WaitForSceneLoadAndTeleport>d__5(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Expected O, but got Unknown
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Expected O, but got Unknown
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00da: Expected O, but got Unknown
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
switch (<>1__state)
{
default:
return false;
case 0:
{
<>1__state = -1;
SceneLoadInfo val = new SceneLoadInfo
{
SceneName = targetScene,
EntryGateName = "left1",
HeroLeaveDirection = (GatePosition)5,
EntryDelay = 0f,
Visualization = (SceneLoadVisualizations)0,
AlwaysUnloadUnusedAssets = true,
EntrySkip = true
};
GameManager.instance.BeginSceneTransition(val);
<>2__current = (object)new WaitWhile((Func<bool>)delegate
{
GameManager instance2 = GameManager.instance;
HeroController instance3 = HeroController.instance;
if ((Object)(object)instance2 == (Object)null || (Object)(object)instance3 == (Object)null)
{
return true;
}
return instance2.IsInSceneTransition || !instance3.isHeroInPosition || instance3.cState.transitioning;
});
<>1__state = 1;
return true;
}
case 1:
<>1__state = -1;
<>2__current = (object)new WaitUntil((Func<bool>)delegate
{
HeroController instance = HeroController.instance;
return (Object)(object)instance != (Object)null && instance.CanInput();
});
<>1__state = 2;
return true;
case 2:
<>1__state = -1;
if (targetPosition != Vector3.zero && (Object)(object)HeroController.instance != (Object)null)
{
((Component)HeroController.instance).transform.position = targetPosition;
}
return false;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
public string currentScene;
public string entryGate;
public Vector3 position;
public static void SaveSceneState(SceneState sceneState)
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
GameManager instance = GameManager.instance;
HeroController instance2 = HeroController.instance;
sceneState.currentScene = instance.GetSceneNameString();
sceneState.entryGate = instance.GetEntryGateName();
sceneState.position = ((Component)instance2).transform.position;
}
[IteratorStateMachine(typeof(<LoadSceneStateCoroutine>d__4))]
public static IEnumerator LoadSceneStateCoroutine(SceneState sceneState)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <LoadSceneStateCoroutine>d__4(0)
{
sceneState = sceneState
};
}
[IteratorStateMachine(typeof(<WaitForSceneLoadAndTeleport>d__5))]
private static IEnumerator WaitForSceneLoadAndTeleport(string targetScene, Vector3 targetPosition)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <WaitForSceneLoadAndTeleport>d__5(0)
{
targetScene = targetScene,
targetPosition = targetPosition
};
}
}
}
namespace Snapshot_SilkSong.PlayerState
{
public class PlayerState
{
public Dictionary<string, object> basicProperties = new Dictionary<string, object>();
public Vector3 position;
public Dictionary<string, bool> abilityStates;
public ToolCrestsData ToolEquips;
public FloatingCrestSlotsData ExtraToolEquips;
public ToolItemsData Tools;
public ToolItemLiquidsData ToolLiquids;
public EnemyJournalKillData EnemyJournalKillData;
public QuestCompletionData QuestCompletionData;
public QuestRumourData QuestRumourData;
public CollectableItemsData Collectables;
public CollectableRelicsData Relics;
public CollectableMementosData MementosDeposited;
public MateriumItemsData MateriumCollected;
public int[] mossBerryValueList;
public int[] GrubFarmerMimicValueList;
public PlayerState()
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Expected O, but got Unknown
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Expected O, but got Unknown
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Expected O, but got Unknown
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Expected O, but got Unknown
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Expected O, but got Unknown
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Expected O, but got Unknown
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Expected O, but got Unknown
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Expected O, but got Unknown
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Expected O, but got Unknown
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: Expected O, but got Unknown
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Expected O, but got Unknown
basicProperties = new Dictionary<string, object>();
abilityStates = new Dictionary<string, bool>();
Tools = new ToolItemsData();
ToolLiquids = new ToolItemLiquidsData();
EnemyJournalKillData = new EnemyJournalKillData();
QuestCompletionData = new QuestCompletionData();
QuestRumourData = new QuestRumourData();
Collectables = new CollectableItemsData();
Relics = new CollectableRelicsData();
MementosDeposited = new CollectableMementosData();
MateriumCollected = new MateriumItemsData();
mossBerryValueList = Array.Empty<int>();
GrubFarmerMimicValueList = Array.Empty<int>();
ToolEquips = new ToolCrestsData();
ExtraToolEquips = new FloatingCrestSlotsData();
}
public static void SavePlayerState(PlayerState playerState)
{
PlayerData instance = PlayerData.instance;
_ = HeroController.instance;
if (instance == null)
{
return;
}
Type typeFromHandle = typeof(PlayerData);
FieldInfo[] fields = typeFromHandle.GetFields(BindingFlags.Instance | BindingFlags.Public);
PropertyInfo[] properties = typeFromHandle.GetProperties(BindingFlags.Instance | BindingFlags.Public);
playerState.basicProperties.Clear();
FieldInfo[] array = fields;
foreach (FieldInfo fieldInfo in array)
{
if (fieldInfo.FieldType.IsValueType || fieldInfo.FieldType == typeof(string))
{
try
{
object value = fieldInfo.GetValue(instance);
playerState.basicProperties[fieldInfo.Name] = DeepCopier.DeepCopy(value);
}
catch (Exception ex)
{
Debug.LogWarning((object)("Failed to save field " + fieldInfo.Name + ": " + ex.Message));
}
}
}
PropertyInfo[] array2 = properties;
foreach (PropertyInfo propertyInfo in array2)
{
if (propertyInfo.CanRead && propertyInfo.CanWrite && (propertyInfo.PropertyType.IsValueType || propertyInfo.PropertyType == typeof(string)))
{
try
{
object value2 = propertyInfo.GetValue(instance);
playerState.basicProperties[propertyInfo.Name] = DeepCopier.DeepCopy(value2);
}
catch (Exception ex2)
{
Debug.LogWarning((object)("Failed to save property " + propertyInfo.Name + ": " + ex2.Message));
}
}
}
playerState.ToolEquips = DeepCopier.DeepCopy<ToolCrestsData>(instance.ToolEquips);
playerState.ExtraToolEquips = DeepCopier.DeepCopy<FloatingCrestSlotsData>(instance.ExtraToolEquips);
playerState.Tools = DeepCopier.DeepCopy<ToolItemsData>(instance.Tools);
playerState.ToolLiquids = DeepCopier.DeepCopy<ToolItemLiquidsData>(instance.ToolLiquids);
playerState.EnemyJournalKillData = DeepCopier.DeepCopy<EnemyJournalKillData>(instance.EnemyJournalKillData);
playerState.QuestCompletionData = DeepCopier.DeepCopy<QuestCompletionData>(instance.QuestCompletionData);
playerState.QuestRumourData = DeepCopier.DeepCopy<QuestRumourData>(instance.QuestRumourData);
playerState.Collectables = DeepCopier.DeepCopy<CollectableItemsData>(instance.Collectables);
playerState.Relics = DeepCopier.DeepCopy<CollectableRelicsData>(instance.Relics);
playerState.MementosDeposited = DeepCopier.DeepCopy<CollectableMementosData>(instance.MementosDeposited);
playerState.MateriumCollected = DeepCopier.DeepCopy<MateriumItemsData>(instance.MateriumCollected);
playerState.mossBerryValueList = DeepCopier.DeepCopy(instance.mossBerryValueList);
playerState.GrubFarmerMimicValueList = DeepCopier.DeepCopy(instance.GrubFarmerMimicValueList);
}
public static void LoadPlayerState(PlayerState playerState)
{
PlayerData instance = PlayerData.instance;
_ = HeroController.instance;
if (instance == null)
{
return;
}
Type typeFromHandle = typeof(PlayerData);
FieldInfo[] fields = typeFromHandle.GetFields(BindingFlags.Instance | BindingFlags.Public);
PropertyInfo[] properties = typeFromHandle.GetProperties(BindingFlags.Instance | BindingFlags.Public);
FieldInfo[] array = fields;
foreach (FieldInfo fieldInfo in array)
{
if (playerState.basicProperties.ContainsKey(fieldInfo.Name) && (fieldInfo.FieldType.IsValueType || fieldInfo.FieldType == typeof(string)))
{
try
{
object value = playerState.basicProperties[fieldInfo.Name];
fieldInfo.SetValue(instance, value);
}
catch (Exception ex)
{
Debug.LogWarning((object)("Failed to load field " + fieldInfo.Name + ": " + ex.Message));
}
}
}
PropertyInfo[] array2 = properties;
foreach (PropertyInfo propertyInfo in array2)
{
if (playerState.basicProperties.ContainsKey(propertyInfo.Name) && propertyInfo.CanRead && propertyInfo.CanWrite && (propertyInfo.PropertyType.IsValueType || propertyInfo.PropertyType == typeof(string)))
{
try
{
object value2 = playerState.basicProperties[propertyInfo.Name];
propertyInfo.SetValue(instance, value2);
}
catch (Exception ex2)
{
Debug.LogWarning((object)("Failed to load property " + propertyInfo.Name + ": " + ex2.Message));
}
}
}
instance.ToolEquips = DeepCopier.DeepCopy<ToolCrestsData>(playerState.ToolEquips);
instance.ExtraToolEquips = DeepCopier.DeepCopy<FloatingCrestSlotsData>(playerState.ExtraToolEquips);
instance.Tools = DeepCopier.DeepCopy<ToolItemsData>(playerState.Tools);
instance.ToolLiquids = DeepCopier.DeepCopy<ToolItemLiquidsData>(playerState.ToolLiquids);
instance.EnemyJournalKillData = DeepCopier.DeepCopy<EnemyJournalKillData>(playerState.EnemyJournalKillData);
instance.QuestCompletionData = DeepCopier.DeepCopy<QuestCompletionData>(playerState.QuestCompletionData);
instance.QuestRumourData = DeepCopier.DeepCopy<QuestRumourData>(playerState.QuestRumourData);
instance.Collectables = DeepCopier.DeepCopy<CollectableItemsData>(playerState.Collectables);
instance.Relics = DeepCopier.DeepCopy<CollectableRelicsData>(playerState.Relics);
instance.MementosDeposited = DeepCopier.DeepCopy<CollectableMementosData>(playerState.MementosDeposited);
instance.MateriumCollected = DeepCopier.DeepCopy<MateriumItemsData>(playerState.MateriumCollected);
instance.mossBerryValueList = DeepCopier.DeepCopy(playerState.mossBerryValueList);
instance.GrubFarmerMimicValueList = DeepCopier.DeepCopy(playerState.GrubFarmerMimicValueList);
}
}
}
namespace Snapshot_SilkSong.EnemyState
{
public class EnemyState
{
public List<ObjectInfo> enemyList = new List<ObjectInfo>();
public static void SaveEnemyState(EnemyState enemyState, string path)
{
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
ObjectFinder.EnsureDontDestroyOnLoadObject(path, "EnemyState");
enemyState.enemyList.ForEach(delegate(ObjectInfo info)
{
Object.DestroyImmediate((Object)(object)info.targetObject);
});
enemyState.enemyList.Clear();
foreach (ObjectInfo enemy in enemyState.enemyList)
{
if ((Object)(object)enemy.targetObject != (Object)null)
{
Object.DestroyImmediate((Object)(object)enemy.targetObject);
}
}
List<ObjectInfo> list = FindHealthManagerInDirectChildren();
if (list == null || list.Count == 0)
{
return;
}
foreach (ObjectInfo item2 in list)
{
GameObject targetObject = item2.targetObject;
GameObject obj = Object.Instantiate<GameObject>(targetObject, GameObject.Find(path + "/EnemyState").transform);
obj.SetActive(false);
((Object)obj).name = ((Object)targetObject).name;
string path2 = item2.path;
Scene scene = targetObject.scene;
ObjectInfo item = new ObjectInfo(obj, path2, ((Scene)(ref scene)).name, item2.isActive, targetObject.transform);
enemyState.enemyList.Add(item);
}
Object.DontDestroyOnLoad((Object)(object)GameObject.Find(path).transform);
}
public static void LoadEnemyState(EnemyState enemyState, string path)
{
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
FindHealthManagerInDirectChildren().ForEach(delegate(ObjectInfo obj)
{
if ((Object)(object)obj.targetObject != (Object)null)
{
Object.DestroyImmediate((Object)(object)obj.targetObject);
}
});
if (enemyState.enemyList == null || enemyState.enemyList.Count == 0)
{
return;
}
foreach (ObjectInfo enemy in enemyState.enemyList)
{
if (!((Object)(object)enemy.targetObject == (Object)null))
{
GameObject obj2 = Object.Instantiate<GameObject>(enemy.targetObject);
ObjectFinder.PlaceGameObjectToPath(obj2, enemy.path, enemy.sceneName);
((Object)obj2).name = ((Object)enemy.targetObject).name;
obj2.transform.localPosition = enemy.savedLocalPosition;
obj2.transform.localRotation = enemy.savedLocalRotation;
obj2.transform.localScale = enemy.savedLocalScale;
obj2.SetActive(enemy.isActive);
}
}
}
public static List<ObjectInfo> FindHealthManagerInDirectChildren()
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
List<ObjectInfo> list = new List<ObjectInfo>();
for (int i = 0; i < SceneManager.sceneCount; i++)
{
Scene sceneAt = SceneManager.GetSceneAt(i);
if (((Scene)(ref sceneAt)).name == "DontDestroyOnLoad" || ((Scene)(ref sceneAt)).name == "HideAndDontSave")
{
continue;
}
GameObject[] array = Object.FindObjectsByType<GameObject>((FindObjectsInactive)1, (FindObjectsSortMode)0);
foreach (GameObject val in array)
{
if ((Object)(object)val == (Object)null || val.gameObject.scene != sceneAt)
{
continue;
}
HealthManager component = val.GetComponent<HealthManager>();
ActiveCorpse component2 = val.GetComponent<ActiveCorpse>();
if ((Object)(object)component == (Object)null && (Object)(object)component2 == (Object)null)
{
continue;
}
bool flag = false;
foreach (Transform item in val.transform)
{
if ((Object)(object)((Component)item).GetComponent<HeroController>() != (Object)null)
{
flag = true;
break;
}
}
if (!flag)
{
GameObject gameObject = val.gameObject;
string gameObjectPath = ObjectFinder.GetGameObjectPath(gameObject);
Scene scene = gameObject.scene;
list.Add(new ObjectInfo(gameObject, gameObjectPath, ((Scene)(ref scene)).name, gameObject.activeSelf, gameObject.transform));
}
}
}
return list;
}
}
}
namespace Snapshot_SilkSong.Utils
{
public class ConfigManagers : MonoBehaviour
{
public class HotkeySlot
{
public string SlotName { get; set; }
public KeyCode SaveKey { get; set; }
public KeyCode LoadKey { get; set; }
public bool SaveKeyCtrlModifier { get; set; }
public bool LoadKeyCtrlModifier { get; set; }
}
private static ConfigFile config;
public Dictionary<string, HotkeySlot> slots = new Dictionary<string, HotkeySlot>();
public bool PlaySoundOnSave { get; private set; }
public bool PlaySoundOnLoad { get; private set; }
public ConfigManagers()
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Expected O, but got Unknown
config = new ConfigFile(Utility.CombinePaths(new string[2]
{
Paths.ConfigPath,
"Snapshot.cfg"
}), true);
LoadConfig();
}
private void LoadConfig()
{
LoadSoundConfig();
LoadHotkeyConfig();
}
private void LoadSoundConfig()
{
ConfigEntry<bool> val = config.Bind<bool>("Sound", "PlaySoundOnSave", true, "保存时播放音效");
ConfigEntry<bool> val2 = config.Bind<bool>("Sound", "PlaySoundOnLoad", true, "加载时播放音效");
PlaySoundOnSave = val.Value;
PlaySoundOnLoad = val2.Value;
}
private void LoadHotkeyConfig()
{
slots.Clear();
string[] array = new string[4] { "1", "2", "f1", "f2" };
foreach (string text in array)
{
ConfigEntry<string> val = config.Bind<string>(text, "SaveKey", text, "保存按键");
ConfigEntry<string> val2 = config.Bind<string>(text, "LoadKey", "ctrl, " + text, "加载按键");
slots[text] = ParseHotkeyConfig(text, val.Value, val2.Value);
}
}
private HotkeySlot ParseHotkeyConfig(string slotName, string saveKeyStr, string loadKeyStr)
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
HotkeySlot obj = new HotkeySlot
{
SlotName = slotName
};
ParseKeyCombo(saveKeyStr, out var key, out var ctrlModifier);
obj.SaveKey = key;
obj.SaveKeyCtrlModifier = ctrlModifier;
ParseKeyCombo(loadKeyStr, out var key2, out var ctrlModifier2);
obj.LoadKey = key2;
obj.LoadKeyCtrlModifier = ctrlModifier2;
return obj;
}
private void ParseKeyCombo(string keyCombo, out KeyCode key, out bool ctrlModifier)
{
ctrlModifier = false;
key = (KeyCode)0;
if (string.IsNullOrWhiteSpace(keyCombo))
{
return;
}
List<string> list = (from p in keyCombo.ToLower().Split(new char[3] { ',', '+', ' ' }, StringSplitOptions.RemoveEmptyEntries)
select p.Trim() into p
where !string.IsNullOrEmpty(p)
select p).ToList();
if (list.Count != 0)
{
HashSet<string> ctrlKeywords = new HashSet<string> { "ctrl", "control" };
Dictionary<string, KeyCode> obj = new Dictionary<string, KeyCode>
{
["1"] = (KeyCode)49,
["2"] = (KeyCode)50,
["3"] = (KeyCode)51,
["4"] = (KeyCode)52,
["5"] = (KeyCode)53,
["6"] = (KeyCode)54,
["7"] = (KeyCode)55,
["8"] = (KeyCode)56,
["9"] = (KeyCode)57,
["0"] = (KeyCode)48,
["num0"] = (KeyCode)256,
["num1"] = (KeyCode)257,
["num2"] = (KeyCode)258,
["num3"] = (KeyCode)259,
["num4"] = (KeyCode)260,
["num5"] = (KeyCode)261,
["num6"] = (KeyCode)262,
["num7"] = (KeyCode)263,
["num8"] = (KeyCode)264,
["num9"] = (KeyCode)265,
["enter"] = (KeyCode)13,
["return"] = (KeyCode)13,
["esc"] = (KeyCode)27,
["escape"] = (KeyCode)27,
["space"] = (KeyCode)32,
["tab"] = (KeyCode)9,
["backspace"] = (KeyCode)8,
["delete"] = (KeyCode)127,
["insert"] = (KeyCode)277,
["home"] = (KeyCode)278,
["end"] = (KeyCode)279,
["pageup"] = (KeyCode)280,
["pagedown"] = (KeyCode)281,
["up"] = (KeyCode)273,
["down"] = (KeyCode)274,
["left"] = (KeyCode)276,
["right"] = (KeyCode)275
};
ctrlModifier = list.Any((string p) => ctrlKeywords.Contains(p));
string text = list.Last((string p) => !ctrlKeywords.Contains(p));
if (!obj.TryGetValue(text, out key) && !Enum.TryParse<KeyCode>(text, ignoreCase: true, out key) && (text.Length != 1 || !char.IsLetterOrDigit(text[0]) || !Enum.TryParse<KeyCode>(text.ToUpper(), out key)))
{
Debug.LogWarning((object)("Undefined Key: " + text));
}
}
}
public bool CheckHotkey(KeyCode key, bool requireCtrl)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
if ((int)key == 0)
{
return false;
}
bool flag = Input.GetKey((KeyCode)306) || Input.GetKey((KeyCode)305);
if (requireCtrl && !flag)
{
return false;
}
if (!requireCtrl && flag)
{
return false;
}
return Input.GetKeyDown(key);
}
}
public static class StateController
{
public static bool IsFsmEnabled = true;
public static long counter = 0L;
public static bool ShouldExecute()
{
return IsFsmEnabled;
}
}
public class ObjectFinder
{
public static void EnsureDontDestroyOnLoadObject(string path, string name)
{
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Expected O, but got Unknown
if (!((Object)(object)GameObject.Find(string.IsNullOrEmpty(path) ? name : (path + "/" + name)) != (Object)null))
{
GameObject val = (string.IsNullOrEmpty(path) ? null : EnsureParentPath(path));
GameObject val2 = new GameObject(name);
Object.DontDestroyOnLoad((Object)(object)val2);
if ((Object)(object)val != (Object)null)
{
val2.transform.SetParent(val.transform);
}
}
}
private static GameObject EnsureParentPath(string path)
{
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Expected O, but got Unknown
if (string.IsNullOrEmpty(path))
{
return null;
}
string text = "";
Transform val = null;
string[] array = path.Split(new char[1] { '/' });
foreach (string text2 in array)
{
if (string.IsNullOrEmpty(text2))
{
continue;
}
text = text + ((text.Length > 0) ? "/" : "") + text2;
GameObject val2 = GameObject.Find(text);
if ((Object)(object)val2 == (Object)null)
{
val2 = new GameObject(text2);
Object.DontDestroyOnLoad((Object)(object)val2);
if ((Object)(object)val != (Object)null)
{
val2.transform.SetParent(val);
}
}
val = val2.transform;
}
if (val == null)
{
return null;
}
return ((Component)val).gameObject;
}
public static string GetGameObjectPath(GameObject obj)
{
string text = ((Object)obj).name;
Transform parent = obj.transform.parent;
while ((Object)(object)parent != (Object)null)
{
text = ((Object)parent).name + "/" + text;
parent = parent.parent;
}
return text;
}
public static void PlaceGameObjectToPath(GameObject obj, string path, string sceneName)
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_018b: Unknown result type (might be due to invalid IL or missing references)
//IL_0190: Unknown result type (might be due to invalid IL or missing references)
//IL_019d: Unknown result type (might be due to invalid IL or missing references)
//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_0116: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
//IL_0133: Expected O, but got Unknown
if (string.IsNullOrEmpty(path))
{
return;
}
string[] array = path.Split(new char[1] { '/' });
Scene val = SceneManager.GetActiveScene();
if (!string.IsNullOrEmpty(sceneName))
{
Scene sceneByName = SceneManager.GetSceneByName(sceneName);
if (((Scene)(ref sceneByName)).IsValid() && ((Scene)(ref sceneByName)).isLoaded)
{
val = sceneByName;
if (obj.scene != val)
{
SceneManager.MoveGameObjectToScene(obj, val);
}
}
else
{
Debug.LogWarning((object)("Scene '" + sceneName + "' is not loaded, using active scene instead."));
}
}
if (array.Length == 1)
{
obj.transform.SetParent((Transform)null, false);
((Object)obj).name = array[0];
return;
}
Transform val2 = null;
for (int i = 0; i < array.Length - 1; i++)
{
string text = array[i];
if ((Object)(object)val2 == (Object)null)
{
GameObject[] rootGameObjects = ((Scene)(ref val)).GetRootGameObjects();
GameObject val3 = null;
GameObject[] array2 = rootGameObjects;
foreach (GameObject val4 in array2)
{
if (((Object)val4).name == text)
{
val3 = val4;
break;
}
}
if ((Object)(object)val3 == (Object)null)
{
GameObject val5 = new GameObject(text);
val5.transform.position = Vector3.zero;
val5.transform.rotation = Quaternion.identity;
val5.transform.localScale = Vector3.one;
val2 = val5.transform;
SceneManager.MoveGameObjectToScene(val5, val);
}
else
{
val2 = val3.transform;
}
continue;
}
Transform val6 = null;
for (int k = 0; k < val2.childCount; k++)
{
if (((Object)val2.GetChild(k)).name == text)
{
val6 = val2.GetChild(k);
break;
}
}
if ((Object)(object)val6 == (Object)null)
{
GameObject val7 = new GameObject(text);
val7.transform.SetParent(val2, false);
val7.transform.localPosition = Vector3.zero;
val7.transform.localRotation = Quaternion.identity;
val7.transform.localScale = Vector3.one;
val2 = val7.transform;
}
else
{
val2 = val6;
}
}
if ((Object)(object)val2 != (Object)null)
{
obj.transform.SetParent(val2, false);
}
else
{
obj.transform.SetParent((Transform)null, false);
}
((Object)obj).name = array[^1];
}
public static void DeleteHealthManagerImmediate(GameObject rootObject)
{
if ((Object)(object)rootObject == (Object)null)
{
return;
}
HealthManager[] componentsInChildren = rootObject.GetComponentsInChildren<HealthManager>(true);
if (componentsInChildren.Length == 0)
{
return;
}
HealthManager[] array = componentsInChildren;
foreach (HealthManager val in array)
{
if ((Object)(object)val != (Object)null && (Object)(object)((Component)val).gameObject != (Object)null)
{
GetGameObjectPath(((Component)val).gameObject);
Object.DestroyImmediate((Object)(object)((Component)val).gameObject);
}
}
}
public static GameObject FindGameObjectByPath(string sceneName, string path)
{
GameObject val = GameObject.Find(path);
if ((Object)(object)val == (Object)null)
{
val = FindGameObjectInHierarchy(path);
}
return val;
}
private static GameObject FindGameObjectInHierarchy(string path)
{
string[] array = path.Split(new char[1] { '/' });
GameObject val = null;
string[] array2 = array;
foreach (string text in array2)
{
if (!string.IsNullOrEmpty(text))
{
if ((Object)(object)val == (Object)null)
{
val = GameObject.Find(text);
}
else
{
Transform val2 = val.transform.Find(text);
val = (((Object)(object)val2 != (Object)null) ? ((Component)val2).gameObject : null);
}
if ((Object)(object)val == (Object)null)
{
break;
}
}
}
return val;
}
}
[Serializable]
public class ObjectInfo
{
public GameObject targetObject;
public string path;
public string sceneName;
public bool isActive;
public Vector3 savedLocalPosition;
public Quaternion savedLocalRotation;
public Vector3 savedLocalScale;
public ObjectInfo(GameObject gameObject, string path, string sceneName, bool isActive, Transform originalTransform)
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
targetObject = gameObject;
this.path = path;
this.sceneName = sceneName;
this.isActive = isActive;
savedLocalPosition = originalTransform.localPosition;
savedLocalRotation = originalTransform.localRotation;
savedLocalScale = originalTransform.localScale;
}
}
}
namespace Snapshot_SilkSong.Utils.Snapshot_SilkSong.Patches
{
[HarmonyPatch]
public class StatePatches
{
private static bool Prefix_OtherType(string typeName, string methodName)
{
_ = typeName + "." + methodName;
return StateController.ShouldExecute();
}
[HarmonyPatch(typeof(PlayMakerFSM), "OnDisable")]
[HarmonyPrefix]
private static bool Prefix_PlayMakerFSM_OnDisable()
{
return Prefix_OtherType("PlayMakerFSM", "OnDisable");
}
[HarmonyPatch(typeof(PlayMakerFSM), "OnEnable")]
[HarmonyPrefix]
private static bool Prefix_Fsm_OnEnable()
{
return Prefix_OtherType("Fsm", "OnEnable");
}
[HarmonyPatch(typeof(PlayMakerFSM), "AddEventHandlerComponents")]
[HarmonyPrefix]
private static bool Prefix_Fsm_AddEventHandlerComponents()
{
return Prefix_OtherType("Fsm", "AddEventHandlerComponents");
}
[HarmonyPatch(typeof(PlayMakerFSM), "Start")]
[HarmonyPrefix]
private static bool Prefix_PlayMakerFSM_Awake()
{
return Prefix_OtherType("PlayMakerFSM", "Start");
}
[HarmonyPatch(typeof(HealthManager), "Awake")]
[HarmonyPrefix]
private static bool Prefix_PlayMakerFSM_Awake(HealthManager __instance)
{
Object.Destroy((Object)(object)((Component)__instance).GetComponent<TagDamageTaker>());
return true;
}
[HarmonyPatch(typeof(HealthManager), "HealToMax")]
[HarmonyPrefix]
private static bool PrefixHealthManager_HealToMax()
{
return Prefix_OtherType("HealthManager", "HealToMax");
}
[HarmonyPatch(typeof(HealthManager), "AddPhysicalPusher")]
[HarmonyPrefix]
private static bool Prefix_HealthManager_AddPhysicalPusher()
{
return Prefix_OtherType("HealthManager", "AddPhysicalPusher");
}
}
}
namespace Snapshot_SilkSong.States
{
public class FSMState
{
public static void SaveFSMState(MemorySnapshot memorySnapshot)
{
foreach (ObjectInfo enemy in memorySnapshot.enemyState.enemyList)
{
string text = enemy.sceneName + "/" + enemy.path;
GameObject targetObject = enemy.targetObject;
if ((Object)(object)targetObject == (Object)null)
{
Debug.LogWarning((object)("TargetObject is null for path: " + text));
continue;
}
GameObject val = ObjectFinder.FindGameObjectByPath(enemy.sceneName, enemy.path);
if ((Object)(object)val != (Object)null)
{
SyncAllFSMs(val, targetObject);
SynciTweens(val, targetObject);
}
else
{
Debug.LogWarning((object)("Cannot find source GameObject for path: " + text));
}
}
}
public static void LoadFSMState(MemorySnapshot memorySnapshot)
{
foreach (ObjectInfo enemy in memorySnapshot.enemyState.enemyList)
{
string text = enemy.sceneName + "/" + enemy.path;
GameObject targetObject = enemy.targetObject;
if (!((Object)(object)targetObject == (Object)null))
{
GameObject val = ObjectFinder.FindGameObjectByPath(enemy.sceneName, enemy.path);
if ((Object)(object)val != (Object)null)
{
SyncAllFSMs(targetObject, val);
SynciTweens(targetObject, val);
}
else
{
Debug.LogWarning((object)("Cannot find source GameObject for path: " + text));
}
}
}
}
private static void CopyFsmVariables(FsmVariables source, FsmVariables target)
{
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
FsmFloat[] floatVariables = source.FloatVariables;
FsmFloat[] floatVariables2 = target.FloatVariables;
for (int i = 0; i < floatVariables.Length; i++)
{
floatVariables2[i].Value = floatVariables[i].Value;
}
FsmInt[] intVariables = source.IntVariables;
FsmInt[] intVariables2 = target.IntVariables;
for (int j = 0; j < intVariables.Length; j++)
{
intVariables2[j].Value = intVariables[j].Value;
}
FsmBool[] boolVariables = source.BoolVariables;
FsmBool[] boolVariables2 = target.BoolVariables;
for (int k = 0; k < boolVariables.Length; k++)
{
boolVariables2[k].Value = boolVariables[k].Value;
}
FsmString[] stringVariables = source.StringVariables;
FsmString[] stringVariables2 = target.StringVariables;
for (int l = 0; l < stringVariables.Length; l++)
{
stringVariables2[l].Value = stringVariables[l].Value;
}
FsmVector3[] vector3Variables = source.Vector3Variables;
FsmVector3[] vector3Variables2 = target.Vector3Variables;
for (int m = 0; m < vector3Variables.Length; m++)
{
vector3Variables2[m].Value = vector3Variables[m].Value;
}
}
private static void SyncAllFSMs(GameObject source, GameObject target)
{
PlayMakerFSM[] components = source.GetComponents<PlayMakerFSM>();
PlayMakerFSM[] components2 = target.GetComponents<PlayMakerFSM>();
for (int i = 0; i < components.Length && i < components2.Length; i++)
{
Fsm fsm = components[i].Fsm;
Fsm fsm2 = components2[i].Fsm;
CopyFsmVariables(fsm.Variables, fsm2.Variables);
string activeStateName = fsm.ActiveStateName;
if (!string.IsNullOrEmpty(activeStateName))
{
fsm2.StartState = activeStateName;
}
}
}
private static void SynciTweens(GameObject source, GameObject target)
{
iTween[] components = source.GetComponents<iTween>();
iTween[] components2 = target.GetComponents<iTween>();
for (int i = 0; i < components.Length && i < components2.Length; i++)
{
SynciTweenParams(components[i], components2[i]);
}
}
private static void SynciTweenParams(iTween source, iTween target)
{
FieldInfo[] fields = typeof(iTween).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
string[] array = new string[12]
{
"time", "delay", "percentage", "namedcolorvalue", "loopType", "easeType", "space", "isLocal", "useRealTime", "physics",
"reverse", "loop"
};
foreach (string fieldName in array)
{
FieldInfo fieldInfo = Array.Find(fields, (FieldInfo f) => f.Name == fieldName);
if (fieldInfo != null)
{
try
{
object value = fieldInfo.GetValue(source);
fieldInfo.SetValue(target, value);
}
catch
{
}
}
}
FieldInfo field = typeof(iTween).GetField("tweenArguments", BindingFlags.Instance | BindingFlags.NonPublic);
if (field != null && field.GetValue(source) is Hashtable hashtable)
{
Hashtable hashtable2 = new Hashtable();
foreach (DictionaryEntry item in hashtable)
{
if (item.Value == null)
{
hashtable2[item.Key] = null;
continue;
}
Type type = item.Value.GetType();
if (type.IsValueType || type == typeof(string))
{
hashtable2[item.Key] = item.Value;
continue;
}
object? value2 = item.Value;
Object val = (Object)((value2 is Object) ? value2 : null);
if (val != null)
{
hashtable2[item.Key] = val;
}
}
field.SetValue(target, hashtable2);
}
FieldInfo field2 = typeof(iTween).GetField("isRunning", BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo field3 = typeof(iTween).GetField("percentage", BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo field4 = typeof(iTween).GetField("running", BindingFlags.Instance | BindingFlags.NonPublic);
if (!(field2 == null) && !(field3 == null))
{
bool flag = (bool)field2.GetValue(source);
float num = (float)field3.GetValue(source);
field2.SetValue(target, flag);
field3.SetValue(target, num);
if (field4 != null)
{
field4.SetValue(target, flag);
}
}
}
}
public class PersistentState
{
public List<ObjectInfo> persistentList = new List<ObjectInfo>();
public static void SavePersistentState(PersistentState persistentState, string path)
{
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
ObjectFinder.EnsureDontDestroyOnLoadObject(path, "PersistentState");
foreach (ObjectInfo persistent in persistentState.persistentList)
{
if ((Object)(object)persistent.targetObject != (Object)null)
{
Object.DestroyImmediate((Object)(object)persistent.targetObject);
}
}
persistentState.persistentList.Clear();
List<ObjectInfo> list = FindPersistentBoolItemInDirectChildren();
if (list == null || list.Count == 0)
{
return;
}
foreach (ObjectInfo item2 in list)
{
GameObject targetObject = item2.targetObject;
GameObject obj = Object.Instantiate<GameObject>(targetObject, GameObject.Find(path + "/PersistentState").transform);
obj.SetActive(false);
((Object)obj).name = ((Object)targetObject).name;
string path2 = item2.path;
Scene scene = targetObject.scene;
ObjectInfo item = new ObjectInfo(obj, path2, ((Scene)(ref scene)).name, item2.isActive, targetObject.transform);
persistentState.persistentList.Add(item);
}
Object.DontDestroyOnLoad((Object)(object)GameObject.Find(path).transform);
}
public static void LoadPersistentState(PersistentState persistentState, string path)
{
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
FindPersistentBoolItemInDirectChildren().ForEach(delegate(ObjectInfo obj)
{
if ((Object)(object)obj.targetObject != (Object)null)
{
Object.DestroyImmediate((Object)(object)obj.targetObject);
}
});
if (persistentState.persistentList == null || persistentState.persistentList.Count == 0)
{
return;
}
foreach (ObjectInfo persistent in persistentState.persistentList)
{
if (!((Object)(object)persistent.targetObject == (Object)null))
{
GameObject obj2 = Object.Instantiate<GameObject>(persistent.targetObject);
ObjectFinder.PlaceGameObjectToPath(obj2, persistent.path, persistent.sceneName);
((Object)obj2).name = ((Object)persistent.targetObject).name;
obj2.transform.localPosition = persistent.savedLocalPosition;
obj2.transform.localRotation = persistent.savedLocalRotation;
obj2.transform.localScale = persistent.savedLocalScale;
obj2.SetActive(persistent.isActive);
}
}
}
public static List<ObjectInfo> FindPersistentBoolItemInDirectChildren()
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
//IL_0158: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
List<ObjectInfo> list = new List<ObjectInfo>();
for (int i = 0; i < SceneManager.sceneCount; i++)
{
Scene sceneAt = SceneManager.GetSceneAt(i);
if (((Scene)(ref sceneAt)).name == "DontDestroyOnLoad" || ((Scene)(ref sceneAt)).name == "HideAndDontSave")
{
continue;
}
PersistentBoolItem[] array = Object.FindObjectsByType<PersistentBoolItem>((FindObjectsInactive)1, (FindObjectsSortMode)0);
foreach (PersistentBoolItem val in array)
{
if ((Object)(object)val == (Object)null || ((Component)val).gameObject.scene != sceneAt)
{
continue;
}
bool flag = false;
Transform parent = ((Component)val).transform.parent;
while ((Object)(object)parent != (Object)null)
{
HealthManager component = ((Component)parent).GetComponent<HealthManager>();
BattleScene component2 = ((Component)parent).GetComponent<BattleScene>();
string name = ((Object)((Component)val).gameObject).name;
if ((Object)(object)component != (Object)null || (Object)(object)component2 != (Object)null || name == "Battle Scene")
{
flag = true;
break;
}
parent = parent.parent;
}
if (flag)
{
continue;
}
bool flag2 = false;
foreach (Transform item in ((Component)val).transform)
{
if ((Object)(object)((Component)item).GetComponent<HeroController>() != (Object)null)
{
flag2 = true;
break;
}
}
if (!flag2)
{
GameObject gameObject = ((Component)val).gameObject;
string gameObjectPath = ObjectFinder.GetGameObjectPath(gameObject);
Scene scene = gameObject.scene;
list.Add(new ObjectInfo(gameObject, gameObjectPath, ((Scene)(ref scene)).name, gameObject.activeSelf, gameObject.transform));
}
}
}
return list;
}
}
}
namespace Snapshot_SilkSong.CocoonState
{
public class CocoonState
{
public List<ObjectInfo> CocoonSceneList;
public CocoonState()
{
CocoonSceneList = new List<ObjectInfo>();
}
public static void SaveCocoonState(CocoonState cocoonState, string path)
{
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
ObjectFinder.EnsureDontDestroyOnLoadObject(path, "CocoonStates");
foreach (ObjectInfo cocoonScene in cocoonState.CocoonSceneList)
{
if ((Object)(object)cocoonScene.targetObject != (Object)null)
{
Object.DestroyImmediate((Object)(object)cocoonScene.targetObject);
}
}
cocoonState.CocoonSceneList.Clear();
List<ObjectInfo> list = FindCocoonScene();
if (list == null || list.Count == 0)
{
return;
}
foreach (ObjectInfo item2 in list)
{
GameObject targetObject = item2.targetObject;
GameObject obj = Object.Instantiate<GameObject>(targetObject, GameObject.Find(path + "CocoonStates/").transform);
obj.SetActive(false);
((Object)obj).name = ((Object)targetObject).name;
string path2 = item2.path;
Scene scene = targetObject.scene;
ObjectInfo item = new ObjectInfo(obj, path2, ((Scene)(ref scene)).name, item2.isActive, targetObject.transform);
cocoonState.CocoonSceneList.Add(item);
}
Object.DontDestroyOnLoad((Object)(object)GameObject.Find(path).transform);
}
public static void LoadCocoonState(CocoonState cocoonState, string path)
{
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
foreach (ObjectInfo item in FindCocoonScene())
{
if ((Object)(object)item.targetObject != (Object)null)
{
Object.DestroyImmediate((Object)(object)item.targetObject);
}
}
if (cocoonState.CocoonSceneList == null || cocoonState.CocoonSceneList.Count == 0)
{
return;
}
foreach (ObjectInfo cocoonScene in cocoonState.CocoonSceneList)
{
if (!((Object)(object)cocoonScene.targetObject == (Object)null))
{
GameObject obj = Object.Instantiate<GameObject>(cocoonScene.targetObject);
((Object)obj).name = ((Object)cocoonScene.targetObject).name;
ObjectFinder.PlaceGameObjectToPath(obj, cocoonScene.path, cocoonScene.sceneName);
obj.transform.localPosition = cocoonScene.savedLocalPosition;
obj.transform.localRotation = cocoonScene.savedLocalRotation;
obj.transform.localScale = cocoonScene.savedLocalScale;
obj.SetActive(true);
}
}
}
public static List<ObjectInfo> FindCocoonScene()
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
List<ObjectInfo> list = new List<ObjectInfo>();
for (int i = 0; i < SceneManager.sceneCount; i++)
{
Scene sceneAt = SceneManager.GetSceneAt(i);
if (!(((Scene)(ref sceneAt)).name == "DontDestroyOnLoad") && !(((Scene)(ref sceneAt)).name == "HideAndDontSave"))
{
GameObject[] rootGameObjects = ((Scene)(ref sceneAt)).GetRootGameObjects();
for (int j = 0; j < rootGameObjects.Length; j++)
{
FindCocoonObjectsRecursive(rootGameObjects[j], sceneAt, list);
}
}
}
return list;
}
private static void FindCocoonObjectsRecursive(GameObject currentObj, Scene scene, List<ObjectInfo> cocoonList)
{
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
if (((Object)currentObj).name == "Hornet Cocoon Corpse(Clone)")
{
string gameObjectPath = ObjectFinder.GetGameObjectPath(currentObj);
cocoonList.Add(new ObjectInfo(currentObj, gameObjectPath, ((Scene)(ref scene)).name, currentObj.activeSelf, currentObj.transform));
}
foreach (Transform item in currentObj.transform)
{
FindCocoonObjectsRecursive(((Component)item).gameObject, scene, cocoonList);
}
}
}
}
namespace Snapshot_SilkSong.BossState
{
public class BossState
{
public List<ObjectInfo> BossSceneList;
public BossState()
{
BossSceneList = new List<ObjectInfo>();
}
public static void SaveBossState(BossState bossState, string path)
{
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
ObjectFinder.EnsureDontDestroyOnLoadObject(path, "BossStates");
foreach (ObjectInfo bossScene in bossState.BossSceneList)
{
if ((Object)(object)bossScene.targetObject != (Object)null)
{
Object.DestroyImmediate((Object)(object)bossScene.targetObject);
}
}
bossState.BossSceneList.Clear();
List<ObjectInfo> list = FindBossScene();
if (list == null || list.Count == 0)
{
return;
}
foreach (ObjectInfo item2 in list)
{
GameObject targetObject = item2.targetObject;
GameObject obj = Object.Instantiate<GameObject>(targetObject, GameObject.Find(path + "BossStates/").transform);
ObjectFinder.DeleteHealthManagerImmediate(obj);
obj.SetActive(false);
((Object)obj).name = ((Object)targetObject).name;
string path2 = item2.path;
Scene scene = targetObject.scene;
ObjectInfo item = new ObjectInfo(obj, path2, ((Scene)(ref scene)).name, item2.isActive, targetObject.transform);
bossState.BossSceneList.Add(item);
}
Object.DontDestroyOnLoad((Object)(object)GameObject.Find(path).transform);
}
public static void LoadBossState(BossState bossState, string path)
{
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
foreach (ObjectInfo item in FindBossScene())
{
if ((Object)(object)item.targetObject != (Object)null)
{
Object.DestroyImmediate((Object)(object)item.targetObject);
}
}
if (bossState.BossSceneList == null || bossState.BossSceneList.Count == 0)
{
return;
}
foreach (ObjectInfo bossScene in bossState.BossSceneList)
{
if (!((Object)(object)bossScene.targetObject == (Object)null))
{
GameObject obj = Object.Instantiate<GameObject>(bossScene.targetObject);
((Object)obj).name = ((Object)bossScene.targetObject).name;
ObjectFinder.PlaceGameObjectToPath(obj, bossScene.path, bossScene.sceneName);
obj.transform.localPosition = bossScene.savedLocalPosition;
obj.transform.localRotation = bossScene.savedLocalRotation;
obj.transform.localScale = bossScene.savedLocalScale;
obj.SetActive(true);
}
}
}
public static List<ObjectInfo> FindBossScene()
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
List<ObjectInfo> list = new List<ObjectInfo>();
for (int i = 0; i < SceneManager.sceneCount; i++)
{
Scene sceneAt = SceneManager.GetSceneAt(i);
if (((Scene)(ref sceneAt)).name == "DontDestroyOnLoad" || ((Scene)(ref sceneAt)).name == "HideAndDontSave")
{
continue;
}
GameObject[] rootGameObjects = ((Scene)(ref sceneAt)).GetRootGameObjects();
for (int j = 0; j < rootGameObjects.Length; j++)
{
Transform[] componentsInChildren = rootGameObjects[j].GetComponentsInChildren<Transform>(true);
foreach (Transform val in componentsInChildren)
{
if (((Object)((Component)val).gameObject).name == "Boss Scene")
{
GameObject gameObject = ((Component)val).gameObject;
string gameObjectPath = ObjectFinder.GetGameObjectPath(gameObject);
Debug.Log((object)("Found Boss Scene: " + gameObjectPath));
Scene scene = gameObject.scene;
list.Add(new ObjectInfo(gameObject, gameObjectPath, ((Scene)(ref scene)).name, gameObject.activeSelf, gameObject.transform));
}
}
}
}
return list;
}
}
}
namespace Snapshot_SilkSong.BattleState
{
public class BattleState
{
public List<ObjectInfo> BattleSceneList;
public BattleState()
{
BattleSceneList = new List<ObjectInfo>();
}
public static void SaveBattleState(BattleState battleState, string path)
{
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
ObjectFinder.EnsureDontDestroyOnLoadObject(path, "BattleStates");
foreach (ObjectInfo battleScene in battleState.BattleSceneList)
{
if ((Object)(object)battleScene.targetObject != (Object)null)
{
Object.DestroyImmediate((Object)(object)battleScene.targetObject);
}
}
battleState.BattleSceneList.Clear();
List<ObjectInfo> list = FindBattleScene();
if (list == null || list.Count == 0)
{
return;
}
foreach (ObjectInfo item2 in list)
{
GameObject targetObject = item2.targetObject;
GameObject obj = Object.Instantiate<GameObject>(targetObject, GameObject.Find(path + "BattleStates/").transform);
ObjectFinder.DeleteHealthManagerImmediate(obj);
obj.SetActive(false);
((Object)obj).name = ((Object)targetObject).name;
string path2 = item2.path;
Scene scene = targetObject.scene;
ObjectInfo item = new ObjectInfo(obj, path2, ((Scene)(ref scene)).name, item2.isActive, targetObject.transform);
battleState.BattleSceneList.Add(item);
}
Object.DontDestroyOnLoad((Object)(object)GameObject.Find(path).transform);
}
public static void LoadBattleState(BattleState battleState, string path)
{
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
foreach (ObjectInfo item in FindBattleScene())
{
if ((Object)(object)item.targetObject != (Object)null)
{
Object.DestroyImmediate((Object)(object)item.targetObject);
}
}
if (battleState.BattleSceneList == null || battleState.BattleSceneList.Count == 0)
{
return;
}
foreach (ObjectInfo battleScene in battleState.BattleSceneList)
{
if (!((Object)(object)battleScene.targetObject == (Object)null))
{
GameObject obj = Object.Instantiate<GameObject>(battleScene.targetObject);
((Object)obj).name = ((Object)battleScene.targetObject).name;
ObjectFinder.PlaceGameObjectToPath(obj, battleScene.path, battleScene.sceneName);
obj.transform.localPosition = battleScene.savedLocalPosition;
obj.transform.localRotation = battleScene.savedLocalRotation;
obj.transform.localScale = battleScene.savedLocalScale;
obj.SetActive(true);
}
}
}
public static List<ObjectInfo> FindBattleScene()
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
List<ObjectInfo> list = new List<ObjectInfo>();
for (int i = 0; i < SceneManager.sceneCount; i++)
{
Scene sceneAt = SceneManager.GetSceneAt(i);
if (((Scene)(ref sceneAt)).name == "DontDestroyOnLoad" || ((Scene)(ref sceneAt)).name == "HideAndDontSave")
{
continue;
}
BattleScene[] array = Object.FindObjectsByType<BattleScene>((FindObjectsInactive)1, (FindObjectsSortMode)0);
foreach (BattleScene val in array)
{
if ((Object)(object)val == (Object)null)
{
continue;
}
GameObject gameObject = ((Component)val).gameObject;
if (!(gameObject.scene != sceneAt))
{
string gameObjectPath = ObjectFinder.GetGameObjectPath(gameObject);
if (!gameObjectPath.Contains("Boss Scene"))
{
Scene scene = gameObject.scene;
list.Add(new ObjectInfo(gameObject, gameObjectPath, ((Scene)(ref scene)).name, gameObject.activeSelf, gameObject.transform));
}
}
}
}
return list;
}
}
}