using System; using UnityEngine; using System.Collections.Generic; using UnityEngine.UIElements; public class Saveable : MonoBehaviour { public enum ObjectType { Player, BerryBush, Twig, NPC, } [SerializeField] private string uid = ""; [SerializeField] private ObjectType type = ObjectType.BerryBush; #if UNITY_EDITOR void OnValidate() { if (uid != "") { // If the UID is already set, we don't need to do anything return; } // Generate a new UID based on the position of the object uid = Guid.NewGuid().ToString(); } #endif private StateManager stateManager = null; private void Awake() { stateManager = GameObject.FindObjectOfType(); // check if there is a saveState for the current object RestoreMyself(); EnqueueSave(); } void EnqueueSave() { if (stateManager == null) return; // add yourself to the stateManager depending on the type if (type == ObjectType.BerryBush) { // check if the bush is already registered in the berrybushdata array if (stateManager.BerryBushData.Find(e => e.uid == uid) == null) stateManager.BerryBushData.Add(new SaveableBerryBush(uid, transform.position, transform.rotation, gameObject.GetComponent().GetBlueberryCount(), gameObject.GetComponent().AreBlueberriesPicked())); } else if (type == ObjectType.Twig) { if (stateManager.TwigData.Find(e => e.uid == uid) == null) stateManager.TwigData.Add(new SaveableTwig(uid, transform.position, transform.rotation, gameObject.GetComponent().IsCollected())); } else if (type == ObjectType.Player) { stateManager.PlayerData = new SaveablePlayer(uid, transform.position, transform.rotation, gameObject.GetComponent().GetInventoryItems(), gameObject.GetComponent().GetBlueberryCount(), gameObject.GetComponent().GetDialog()); } else if (type == ObjectType.NPC) { if (stateManager.NPCData.Find(e => e.uid == uid) == null) stateManager.NPCData.Add(new SaveableNPC(uid, transform.position, transform.rotation, gameObject.GetComponent().isActive, gameObject.GetComponent().isCompleted, gameObject.GetComponent().GetCurrentQuest())); } } private void RestoreMyself() { if (stateManager == null) return; if (type == ObjectType.BerryBush) { //save itself to the statemanager SaveableBerryBush bush = stateManager.BerryBushData.Find(e => e.uid == uid); BushInteraction interaction = gameObject.GetComponent(); if (bush == null || interaction == null) return; interaction.SetBlueberriesPicked(bush.BlueBerriesPicked); interaction.SetBlueberryCount(bush.blueberryCount); } else if (type == ObjectType.Twig) { SaveableTwig shtick = stateManager.TwigData.Find(e => e.uid == uid); TwigInteraction interaction = gameObject.GetComponent(); if (shtick == null || interaction == null) return; interaction.SetCollected(shtick.collected); } else if (type == ObjectType.Player) { SaveablePlayer player = stateManager.PlayerData; PlayerInteraction interaction = gameObject.GetComponent(); if (player == null) return; interaction.SetInventoryItems(player.inventory); interaction.SetBlueberryCount(player.blueberryCount); interaction.SetDialog(player.dialog); // transform.position = player.position; // transform.rotation = player.rotation; } else if (type == ObjectType.NPC) { SaveableNPC npc = stateManager.NPCData.Find(e => e.uid == uid); QuestGiver questGiver = gameObject.GetComponent(); if (npc == null || questGiver == null) return; questGiver.isActive = npc.isActive; questGiver.isCompleted = npc.isCompleted; questGiver.SetCurrentQuest(npc.dialog); // delete the tree for the beaver quest if it is completed if (questGiver.isCompleted && questGiver.rewardFunction != null) { questGiver.rewardFunction.RewardPlayer(); } } } public string GetUID() { return uid; } public void SaveMyself() { if (stateManager == null) return; if (type == ObjectType.BerryBush) { //save itself to the statemanager SaveableBerryBush bush = stateManager.BerryBushData.Find(e => e.uid == uid); BushInteraction interaction = gameObject.GetComponent(); if (bush == null || interaction == null) return; bush.blueberryCount = interaction.GetBlueberryCount(); bush.BlueBerriesPicked = interaction.AreBlueberriesPicked(); } else if (type == ObjectType.Twig) { SaveableTwig shtick = stateManager.TwigData.Find(e => e.uid == uid); if (shtick == null) return; TwigInteraction interaction = gameObject.GetComponent(); shtick.collected = interaction.IsCollected(); } else if (type == ObjectType.Player) { SaveablePlayer player = stateManager.PlayerData; PlayerInteraction interaction = gameObject.GetComponent(); player.blueberryCount = interaction.GetBlueberryCount(); player.inventory = interaction.GetInventoryItems(); player.dialog = interaction.GetDialog(); // player.position = transform.position; // player.rotation = transform.rotation; } else if (type == ObjectType.NPC) { SaveableNPC npc = stateManager.NPCData.Find(e => e.uid == uid); QuestGiver questGiver = gameObject.GetComponent(); if (npc == null || questGiver == null) return; npc.isActive = questGiver.isActive; npc.isCompleted = questGiver.isCompleted; npc.dialog = questGiver.GetCurrentQuest(); } } private void OnDestroy() { SaveMyself(); } }