using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using UFS2.Tokens; using UnityEngine; public sealed class SaveDataManager : Singleton { [Serializable] public sealed class SaveSettingsDataClass { private float mouseSensitivity = 2f; private float cursorSensitivity = 2f; private bool invertMouse; private bool invertMouseX; private bool smoothCamera; private bool controllerVibration = true; private float fov = 50f; private float fogIntesity = 1f; private float floatSize = 1f; private bool fishCursor = true; private bool realisticLineIndicator; private bool lightshaft = true; private bool showChat = true; private int unitWeight; private int unitLenght; private int timeZone; private int temperature; private float mainSoundVolume = 1f; private float ambienVolume = 0.5f; private float fxVolume = 0.5f; private float underwaterVolume = 0.5f; private float uiVolume = 0.5f; private float enviroVolume = 0.5f; private float weatherVolume = 0.5f; private float vehicleVolume = 0.5f; private float waterVolume = 0.5f; private bool residenceMusic = true; private int textureQualityMode; private int waterPlanarIndex; private int waterSSRModeIndex; private int vSync = 1; private bool blurSetting; private float blurUnderwaterSetting = 0.5f; private bool bloomSetting; private bool chromaticAbberation; private int antiAliasing = 3; private bool ambientOccultion = true; private bool waterReflection = true; private float shadowDistance = 500f; [SerializeField] public int MaxFpsIndex; private bool backgroundMusic = true; [SerializeField] public float MouseSensitivityValue { get { return mouseSensitivity; } set { mouseSensitivity = Mathf.Clamp(value, 0.1f, 5f); } } [SerializeField] public float GamepadCursorSensitivityValue { get { return cursorSensitivity; } set { cursorSensitivity = Mathf.Clamp(value, 0.1f, 5f); } } [SerializeField] public bool IsMouseYInverted { get { return invertMouse; } set { invertMouse = value; } } [SerializeField] public bool IsMouseXInverted { get { return invertMouseX; } set { invertMouseX = value; } } [SerializeField] public bool IsSmoothCameraEnabled { get { return smoothCamera; } set { smoothCamera = value; } } [SerializeField] public bool IsControllerVibrationEnabled { get { return controllerVibration; } set { controllerVibration = value; } } [SerializeField] public float FOVValue { get { return fov; } set { fov = Mathf.Clamp(value, 40f, 90f); } } [SerializeField] public float FogIntensityValue { get { return fogIntesity; } set { fogIntesity = Mathf.Clamp(value, 0f, 1f); } } [SerializeField] public float FloatSizeValue { get { return floatSize; } set { floatSize = Mathf.Clamp(value, 1f, 10f); } } [SerializeField] public bool IsFishCursorEnabled { get { return fishCursor; } set { fishCursor = value; } } [SerializeField] public bool IsLineIndicatorEnabledOnRealistic { get { return realisticLineIndicator; } set { realisticLineIndicator = value; } } [SerializeField] public bool IsLightShaftEnabled { get { return lightshaft; } set { lightshaft = value; } } [SerializeField] public bool IsChatEnabled { get { return showChat; } set { showChat = value; } } [SerializeField] public int WeightUnitIndex { get { return unitWeight; } set { unitWeight = value; } } [SerializeField] public int LengthUnitIndex { get { return unitLenght; } set { unitLenght = value; } } [SerializeField] public int TimeConventionIndex { get { return timeZone; } set { timeZone = value; } } [SerializeField] public int TemperatureUnitIndex { get { return temperature; } set { temperature = value; } } [SerializeField] public float MasterVolume { get { return mainSoundVolume; } set { mainSoundVolume = Mathf.Clamp(value, 0f, 1f); } } [SerializeField] public float MusicVolume { get { return ambienVolume; } set { ambienVolume = Mathf.Clamp(value, 0f, 1f); } } [SerializeField] public float FXVolume { get { return fxVolume; } set { fxVolume = Mathf.Clamp(value, 0f, 1f); } } [SerializeField] public float UnderwaterVolume { get { return underwaterVolume; } set { underwaterVolume = Mathf.Clamp(value, 0f, 1f); } } [SerializeField] public float UIVolume { get { return uiVolume; } set { uiVolume = Mathf.Clamp(value, 0f, 1f); } } [SerializeField] public float EnviroVolume { get { return enviroVolume; } set { enviroVolume = Mathf.Clamp(value, 0f, 1f); } } [SerializeField] public float WeatherVolume { get { return weatherVolume; } set { weatherVolume = Mathf.Clamp(value, 0f, 1f); } } [SerializeField] public float VehicleVolume { get { return vehicleVolume; } set { vehicleVolume = Mathf.Clamp(value, 0f, 1f); } } [SerializeField] public float WaterVolume { get { return waterVolume; } set { waterVolume = Mathf.Clamp(value, 0f, 1f); } } [SerializeField] public bool IsResidenceMusicEnabled { get { return residenceMusic; } set { residenceMusic = value; } } [SerializeField] public int TextureQualityModeIndex { get { return textureQualityMode; } set { textureQualityMode = value; } } public int WaterPlanarModeIndex { get { return waterPlanarIndex; } set { waterPlanarIndex = value; } } public int WaterSSRModeIndex { get { return waterSSRModeIndex; } set { waterSSRModeIndex = value; } } [SerializeField] public bool IsVSyncEnabled { get { return vSync == 1; } set { vSync = (value ? 1 : 0); } } [SerializeField] public bool IsBlurEnabled { get { return blurSetting; } set { blurSetting = value; } } [SerializeField] public float BlurUnderwaterSetting { get { return blurUnderwaterSetting; } set { blurUnderwaterSetting = value; } } [SerializeField] public bool IsBloomEnabled { get { return bloomSetting; } set { bloomSetting = value; } } [SerializeField] public bool IsChromaticAberrationEnabled { get { return chromaticAbberation; } set { chromaticAbberation = value; } } [SerializeField] public int AntiAliasingModeIndex { get { return antiAliasing; } set { antiAliasing = value; } } [SerializeField] public bool IsAmbientOcclusionEnabled { get { return ambientOccultion; } set { ambientOccultion = value; } } [SerializeField] public bool IsWaterReflectionEnabled { get { return waterReflection; } set { waterReflection = value; } } [SerializeField] public float ShadowDistanceValue { get { return shadowDistance; } set { shadowDistance = Mathf.Clamp(value, 0f, 500f); } } [SerializeField] public bool IsBackgroundMusicEnabled { get { return backgroundMusic; } set { backgroundMusic = value; } } } [Serializable] public sealed class SavePlayerDataClass { private bool tutPopHide; private bool isEnabled; private GameManager.PlayerData.CPlayer.GameMode gameMode; private string playerName = ""; private int playerLevel = 1; private float playerExp; private int playerSkillsPoint; private int playerSelectedTree = -1; private float playerMaxExp = 100f; private float playerCash = 200f; private int playerRewards; private int playerFishNetLevel = 1; private int playerFishNetExp; private int playerRankingPoints; private int playerTournamentsWon; private long lastAquariumUpdateTime; private float timeBoostExp; private float timeBoostCash; private int totalFish; private int totalZombiesFish; private int playerSexIndex; private bool toggleFirstStartHelpPanel; private long timerQuest; private long weeklytimerQuest; private long monthlytimerQuest; private int changeQuestCount = 1; private int pointsCap = 200; private int questPoints; private float totalFishWeight; private bool SkillPointAnim = true; private static string Set1Name = "Custom 1"; private static string Set2Name = "Custom 2"; private static string Set3Name = "Custom 3"; private static string Set4Name = "Custom 4"; private static string Set5Name = "Custom 5"; private List setNames = new List { Set1Name, Set2Name, Set3Name, Set4Name, Set5Name }; private int completedDailyQuests; private int completedWeeklyQuests; private int completedMonthlyQuests; private float gameTime; private long lastRentierReward; private List PlayerAccesories; private List PlayerLicences; [SerializeField] public ChristmasPlayerData ChristmasData = new ChristmasPlayerData(); [SerializeField] public bool HideTutorialPopUp { get { return tutPopHide; } set { tutPopHide = value; } } [SerializeField] public bool IsEnabled { get { return isEnabled; } set { isEnabled = value; } } [SerializeField] public GameManager.PlayerData.CPlayer.GameMode GameMode { get { return gameMode; } set { gameMode = value; } } [SerializeField] public string PlayerName { get { return playerName; } set { playerName = value; } } [SerializeField] public int PlayerLevel { get { return playerLevel; } set { playerLevel = value; } } [SerializeField] public float PlayerExp { get { return playerExp; } set { playerExp = value; } } [SerializeField] public int PlayerSkillsPoint { get { return playerSkillsPoint; } set { playerSkillsPoint = value; } } [SerializeField] public int PlayerSelectedTree { get { return playerSelectedTree; } set { playerSelectedTree = value; } } [SerializeField] public float PlayerMaxExp { get { return playerMaxExp; } set { playerMaxExp = value; } } [SerializeField] public float PlayerCash { get { return playerCash; } set { playerCash = value; } } [SerializeField] public int PlayerRewards { get { return playerRewards; } set { playerRewards = value; } } [SerializeField] public int PlayerFishNetLevel { get { return playerFishNetLevel; } set { playerFishNetLevel = value; } } [SerializeField] public int PlayerFishNetExp { get { return playerFishNetExp; } set { playerFishNetExp = value; } } [SerializeField] public int PlayerRankingPoints { get { return playerRankingPoints; } set { playerRankingPoints = value; } } [SerializeField] public int PlayerTournamentsWon { get { return playerTournamentsWon; } set { playerTournamentsWon = value; } } [SerializeField] public long LastAquariumUpdateTime { get { return lastAquariumUpdateTime; } set { lastAquariumUpdateTime = value; } } [SerializeField] public float TimeBoostExp { get { return timeBoostExp; } set { timeBoostExp = value; } } [SerializeField] public float TimeBoostCash { get { return timeBoostCash; } set { timeBoostCash = value; } } [SerializeField] public int TotalFish { get { return totalFish; } set { totalFish = value; } } [SerializeField] public int TotalZombiesFish { get { return totalZombiesFish; } set { totalZombiesFish = value; } } [SerializeField] public int PlayerSexIndex { get { return playerSexIndex; } set { playerSexIndex = value; } } [SerializeField] public bool HideStartHelpPanel { get { return toggleFirstStartHelpPanel; } set { toggleFirstStartHelpPanel = value; } } [SerializeField] public long TimerQuest { get { return timerQuest; } set { timerQuest = value; } } [SerializeField] public long WeeklyTimerQuest { get { return weeklytimerQuest; } set { weeklytimerQuest = value; } } [SerializeField] public long MonthlyTimerQuest { get { return monthlytimerQuest; } set { monthlytimerQuest = value; } } [SerializeField] public int AmountOfQuestChangesAvailable { get { return changeQuestCount; } set { changeQuestCount = value; } } [SerializeField] public int PointsCap { get { return pointsCap; } set { pointsCap = value; } } [SerializeField] public int QuestPoints { get { return questPoints; } set { questPoints = value; } } [SerializeField] public float TotalFishWeight { get { return totalFishWeight; } set { totalFishWeight = value; } } [SerializeField] public bool ShowSkillsAnimation { get { return SkillPointAnim; } set { SkillPointAnim = value; } } [SerializeField] public List SetNames { get { return setNames; } set { setNames = value; } } [SerializeField] public int CompletedDailyQuests { get { return completedDailyQuests; } set { completedDailyQuests = value; } } [SerializeField] public int CompletedWeeklyQuests { get { return completedWeeklyQuests; } set { completedWeeklyQuests = value; } } [SerializeField] public int CompletedMonthlyQuests { get { return completedMonthlyQuests; } set { completedMonthlyQuests = value; } } [SerializeField] public float GameTime { get { return gameTime; } set { gameTime = value; } } [SerializeField] public long LastRentierRewardTime { get { return lastRentierReward; } set { lastRentierReward = value; } } [SerializeField] public List PlayerRods { get; set; } [SerializeField] public List PlayerReels { get; set; } [SerializeField] public List PlayerLines { get; set; } [SerializeField] public List PlayerLeaders { get; set; } [SerializeField] public List PlayerBaits { get; set; } [SerializeField] public List PlayerHooks { get; set; } [SerializeField] public List PlayerFloats { get; set; } [SerializeField] public List PlayerFeeders { get; set; } [SerializeField] public List PlayerWeights { get; set; } [SerializeField] public List PlayerAccessories { get { return PlayerAccesories; } set { PlayerAccesories = value; } } [SerializeField] public List PlayerGroundbaits { get; set; } [SerializeField] public List PlayerSlotsEquip { get; set; } [SerializeField] public GameManager.PlayerData.CBasket PlayerShopBasket { get; set; } [SerializeField] public List PlayerFishNet { get; set; } [SerializeField] public List PlayerAquarium { get; set; } [SerializeField] public List PlayerTrophy { get; set; } [SerializeField] public List PlayerQuest { get; set; } [SerializeField] public List PlayerWeeklyQuest { get; set; } [SerializeField] public List PlayerMonthlyQuest { get; set; } [SerializeField] public List PlayerSkills { get; set; } [SerializeField] public List PlayerPersonalRecords { get; set; } [SerializeField] public List PlayerLicenses { get { return PlayerLicences; } set { PlayerLicences = value; } } [SerializeField] public List PlayerBoostTokens { get; set; } public SavePlayerDataClass() { PlayerRods = new List(); PlayerReels = new List(); PlayerLines = new List(); PlayerLeaders = new List(); PlayerBaits = new List(); PlayerHooks = new List(); PlayerFloats = new List(); PlayerFeeders = new List(); PlayerWeights = new List(); PlayerAccessories = new List(); PlayerGroundbaits = new List(); PlayerSlotsEquip = new List(GameManager.Instance._playerData.PlayerSlotsEquipTemplate); PlayerShopBasket = new GameManager.PlayerData.CBasket(); PlayerFishNet = new List(); PlayerAquarium = new List { new GameManager.PlayerData.CAquarium(), new GameManager.PlayerData.CAquarium(), new GameManager.PlayerData.CAquarium(), new GameManager.PlayerData.CAquarium() }; PlayerTrophy = new List(); PlayerQuest = new List(); PlayerWeeklyQuest = new List(); PlayerMonthlyQuest = new List(); PlayerSkills = new List(); PlayerPersonalRecords = new List(); PlayerLicenses = new List(); PlayerBoostTokens = GameManager.Instance._playerData.PlayerBoostTokens; } } public SaveSettingsDataClass SettingsData = new SaveSettingsDataClass(); public List PlayerData = new List(); public const float MinMouseSensitivityValue = 0.1f; public const float MaxMouseSensitivityValue = 5f; public const float MinGamepadCursorSensitivityValue = 0.1f; public const float MaxGamepadCursorSensitivityValue = 5f; public const float MinFOVValue = 40f; public const float MaxFOVValue = 90f; public const float MinFogIntensityValue = 0f; public const float MaxFogIntensityValue = 1f; public const float MinFloatSizeValue = 1f; public const float MaxFloatSizeValue = 10f; public const float MinMasterVolume = 0f; public const float MaxMasterVolume = 1f; public const float MinMusicVolume = 0f; public const float MaxMusicVolume = 1f; public const float MinFXVolume = 0f; public const float MaxFXVolume = 1f; public const float MinUnderwaterVolume = 0f; public const float MaxUnderwaterVolume = 1f; public const float MinUIVolume = 0f; public const float MaxUIVolume = 1f; public const float MinEnviroVolume = 0f; public const float MaxEnviroVolume = 1f; public const float MinWeatherVolume = 0f; public const float MaxWeatherVolume = 1f; public const float MinVehicleVolume = 0f; public const float MaxVehicleVolume = 1f; public const float MinWaterVolume = 0f; public const float MaxWaterVolume = 1f; public const float MinShadowDistanceValue = 0f; public const float MaxShadowDistanceValue = 500f; public SavePlayerDataClass GetCurrentPlayerData() { int currentPlayerProfileIndex = GameManager.Instance._playerData.currentPlayerProfileIndex; if (currentPlayerProfileIndex < 0 || currentPlayerProfileIndex >= PlayerData.Count) { UnityEngine.Debug.LogError($"Invalid index of player data! [Index = {currentPlayerProfileIndex}]"); } return PlayerData[currentPlayerProfileIndex]; } public SavePlayerDataClass GetSpecifiedPlayerData(int index) { if (index < 0 || index >= PlayerData.Count) { UnityEngine.Debug.LogError("Invalid index of player data!"); } return PlayerData[index]; } public void ResetSpecifiedPlayerData(int index) { PlayerData[index] = new SavePlayerDataClass(); } public void ResetSettingsData() { SettingsData = new SaveSettingsDataClass(); } public void CreatePlayerData() { PlayerData.Add(new SavePlayerDataClass()); PlayerData.Add(new SavePlayerDataClass()); PlayerData.Add(new SavePlayerDataClass()); } public void LoadSettingsDataFromGameManager() { UnityEngine.Debug.Log("LoadSettingsDataFromGameManager"); GameManager.PlayerData.CPlayer obj = GameManager.Instance._playerData.Player[0]; FieldInfo[] fields = typeof(SaveSettingsDataClass).GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (FieldInfo fieldInfo in fields) { FieldInfo field = typeof(GameManager.PlayerData.CPlayer).GetField(fieldInfo.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { fieldInfo.SetValue(SettingsData, field.GetValue(obj)); } } } public void LoadPlayerDataFromSPrefs() { UnityEngine.Debug.Log("LoadPlayerDataFromSPrefs"); int currentPlayerProfileIndex = GameManager.Instance._playerData.currentPlayerProfileIndex; FieldInfo[] fields = typeof(SavePlayerDataClass).GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); for (int i = 0; i < GameManager.Instance._playerData.Player.Count; i++) { GameManager.PlayerData.CPlayer obj = GameManager.Instance._playerData.Player[i]; FieldInfo[] array = fields; foreach (FieldInfo fieldInfo in array) { FieldInfo field = typeof(GameManager.PlayerData.CPlayer).GetField(fieldInfo.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { fieldInfo.SetValue(PlayerData[i], field.GetValue(obj)); } } GameManager.Instance._playerData.currentPlayerProfileIndex = i; GameManager.Instance._playerData.LoadAllPlayerData(); PlayerData[i].SetNames = new List { GameManager.Instance._playerData.Player[i].Set1Name, GameManager.Instance._playerData.Player[i].Set2Name, GameManager.Instance._playerData.Player[i].Set3Name, GameManager.Instance._playerData.Player[i].Set4Name, GameManager.Instance._playerData.Player[i].Set5Name }; PlayerData[i].PlayerRods = new List(GameManager.Instance._playerData.PlayerRods); PlayerData[i].PlayerReels = new List(GameManager.Instance._playerData.PlayerReels); PlayerData[i].PlayerLines = new List(GameManager.Instance._playerData.PlayerLines); PlayerData[i].PlayerLeaders = new List(GameManager.Instance._playerData.PlayerLeaders); PlayerData[i].PlayerBaits = new List(GameManager.Instance._playerData.PlayerBaits); PlayerData[i].PlayerHooks = new List(GameManager.Instance._playerData.PlayerHooks); PlayerData[i].PlayerFloats = new List(GameManager.Instance._playerData.PlayerFloats); PlayerData[i].PlayerFeeders = new List(GameManager.Instance._playerData.PlayerFeeders); PlayerData[i].PlayerWeights = new List(GameManager.Instance._playerData.PlayerWeights); PlayerData[i].PlayerAccessories = new List(GameManager.Instance._playerData.PlayerAccesories); PlayerData[i].PlayerGroundbaits = new List(GameManager.Instance._playerData.PlayerGroundbaits); PlayerData[i].PlayerSlotsEquip = new List(GameManager.Instance._playerData.PlayerSlotsEquip); PlayerData[i].PlayerShopBasket = new GameManager.PlayerData.CBasket(); PlayerData[i].PlayerFishNet = new List(GameManager.Instance._playerData.PlayerFishNet); PlayerData[i].PlayerAquarium = new List(GameManager.Instance._playerData.PlayerAquarium); PlayerData[i].PlayerTrophy = new List(GameManager.Instance._playerData.PlayerTrophy); PlayerData[i].PlayerQuest = new List(GameManager.Instance._playerData.PlayerQuest); PlayerData[i].PlayerWeeklyQuest = new List(GameManager.Instance._playerData.PlayerWeeklyQuest); PlayerData[i].PlayerMonthlyQuest = new List(GameManager.Instance._playerData.PlayerMonthlyQuest); PlayerData[i].PlayerSkills = new List(GameManager.Instance._playerData.PlayerSkills); PlayerData[i].PlayerPersonalRecords = new List(GameManager.Instance._playerData.PlayerPersonalRecords); PlayerData[i].PlayerLicenses = new List(GameManager.Instance._playerData.PlayerLicences); PlayerData[i].PlayerBoostTokens = new List(GameManager.Instance._playerData.PlayerBoostTokens); } GameManager.Instance._playerData.currentPlayerProfileIndex = currentPlayerProfileIndex; if (File.Exists(Application.dataPath + "//UFS2_Saves_Backup_fix.bat")) { EasySaveSystemManager.WriteSaveLog("Backup bat start."); Process.Start(Application.dataPath + "//UFS2_Saves_Backup_fix.bat"); } else { EasySaveSystemManager.WriteSaveError("Backup bat not found!"); } foreach (SavePlayerDataClass playerDatum in PlayerData) { UnityEngine.Debug.Log("Data after loading from Prefs: " + playerDatum.PlayerName); } } public bool IsCurrentlySandbox() { return GetCurrentPlayerData().GameMode == GameManager.PlayerData.CPlayer.GameMode.Sandbox; } public bool HasCurrentPlayerSkill(GameManager.Skills skill) { for (int i = 0; i < GetCurrentPlayerData().PlayerSkills.Count; i++) { if (GetCurrentPlayerData().PlayerSkills[i].skill == skill) { return true; } } return false; } public void ResetRodStatuses() { if (GetCurrentPlayerData().PlayerRods == null) { UnityEngine.Debug.LogError("PlayerRods is null!"); return; } if (GameManager.Instance._playerData.currentPlayerProfileIndex < 0) { UnityEngine.Debug.LogError("Current player data is null!"); return; } if (GetCurrentPlayerData().PlayerSlotsEquip == null) { UnityEngine.Debug.LogError("PlayerSlotsEquip is null!"); return; } for (int i = 0; i < GetCurrentPlayerData().PlayerRods.Count; i++) { GetCurrentPlayerData().PlayerRods[i].status = GameManager.PlayerData.CRods.Status.InEquip; } for (int j = 0; j < GetCurrentPlayerData().PlayerSlotsEquip.Count; j++) { GetCurrentPlayerData().PlayerSlotsEquip[j].rod.status = GameManager.PlayerData.CRods.Status.InEquip; } } public void ResetPlayerBaskets() { for (int i = 0; i < PlayerData.Count; i++) { PlayerData[i].PlayerShopBasket = new GameManager.PlayerData.CBasket(); } } }