Need Assist on Saving Data to Save File

Discuss modding questions and implementation details.
l3lessed
Posts: 1400
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Need Assist on Saving Data to Save File

Post by l3lessed »

Here is how I ended up doing it to deal with the conflict between the interface and monobehaviour because I'm crappy at using OOP language. Defined each as its own class within the namespace before starting main script monobehaviour class.

Code: Select all

    public class MyModSaveData
    {
        public string Text;
        public int Items;
    }

    public class SaveInterface: IHasModSaveData
    {
        public Type SaveDataType { get { return typeof(MyModSaveData); } }

        public object NewSaveData() { return null; }

        public object GetSaveData() { return null; }

        public void RestoreSaveData(object saveData)
        {
            var myModSaveData = (MyModSaveData)saveData;
            text = myModSaveData.Text;
            items = myModSaveData.Items;
        }
    }
Then grabbed a new instance of the interface class and pushed it through the SavedDataInterFace.

Code: Select all

mod.SaveDataInterface = new SaveInterface(); 
This seems to compile without an issue. If I understand it correctly, my code is first setting up the class to store the values before it pulls or pushes them. Second, setup interface to create types and objects to pull and push the values between the script value class and the save data file. Third, reference you mod.SavedInterFace and connect it to a new instance of your saved data interface class to begin the push/pull of saved data. Interface is merely the bridge/language between the datas two destination points, initiated script instance and save file.

Now, I just need to figure out how to get the objects setup without destroying the line compiler and define the values. I'm still having the semicolon, line ending issue because I clearly am not understanding how objects are working in a class.

If I remove it, the object compiles fine; Is this okay? Guess need to just test the code by running it.

Next question, will this manage save data complete by itself, once the values, objects, and class interface is setup? Or, do I need to call and push/pull the individual objects/values using the defined interface class methods. Like so?

Code: Select all

            mod.SaveDataInterface = new SaveInterface().NewSaveData; 
Once I get my mod setup to save data to the save file, I'll build a quick copy and past script construct and put up a basic tutorial on how I got it to work within my mod for future modders.

Tragically funny, this one issue is taking longer to resolve than creating the whole mod; well, it's about too. Think hammered out basic mod in probably a total of 8 hours. I think coming up to that amount of time on troubleshooting this issue. :o
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

l3lessed
Posts: 1400
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Need Assist on Saving Data to Save File

Post by l3lessed »

This code structure doesn't cause any compile issues, but I did remove the semicolons from the GetSaveData() object and the NewSaveData() object. If I didn't screw up my OOP language doing so, this might work when pushed into the save data interface? :? Now just need to define the values.

Code: Select all

    public class SaveInterface : IHasModSaveData
    {
        public Type SaveDataType { get { return typeof(MyModSaveData); } }

        public object NewSaveData()
        {
            return new MyModSaveData
            {
                Text = "testing",
                Items = 5
            };
        }

        public object GetSaveData()
        {
            return new MyModSaveData
            {
                Text = text,
                Items = items
            };
        }

        public void RestoreSaveData(object saveData)
        {
            var myModSaveData = (MyModSaveData)saveData;
            text = myModSaveData.Text;
            items = myModSaveData.Items;
        }
    }
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

l3lessed
Posts: 1400
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Need Assist on Saving Data to Save File

Post by l3lessed »

Still hammering away at trying to sort the OOP language out for the save data interface. This is where I am. Compile errors are gone, but my OOP language is still fubared, as mod manager dumps and object error.

Code: Select all

namespace DaggerfallWorkshop.Game
{
    [FullSerializer.fsObject("v1")]
    public class MyModSaveData
    {
        public string Text;
    }

    public class SaveInterface : IHasModSaveData
    {
	string text;

        public Type SaveDataType { get { return typeof(MyModSaveData); } }

        public object NewSaveData()
        {
            return new MyModSaveData
            {
                Text = "testing"
            };
        }

        public object GetSaveData()
        {
            return new MyModSaveData
            {
                Text = text
            };
        }

        public void RestoreSaveData(object saveData)
        {
            var myModSaveData = (MyModSaveData)saveData;
            text = myModSaveData.Text;
        }
    }

Code: Select all

            mod.SaveDataInterface = new SaveInterface();
From my understanding, my issue has to do with how I am setting up the class value and corresponding object text correctly. As a result, when the seralizer tries to read and use it, it kicks out the error.

I've tried setting up the value has a private class value to store it within the interface class as it is being moved into the serializer. I tried setting it up as a property type with a get, set. Same thing.
Exception has been thrown by the target of an invocation.
UnityEngine.Debug:LogError(Object)
DaggerfallWorkshop.Game.Utility.ModSupport.ModManager:InvokeModLoaders(StateTypes) (at Assets/Game/Addons/ModSupport/ModManager.cs:706)
DaggerfallWorkshop.Game.Utility.ModSupport.ModManager:StateManager_OnStateChange(StateTypes) (at Assets/Game/Addons/ModSupport/ModManager.cs:1097)
DaggerfallWorkshop.Game.StateManager:TriggerStateChange(StateTypes) (at Assets/Scripts/Game/StateManager.cs:153)
DaggerfallWorkshop.Game.StateManager:ChangeState(StateTypes) (at Assets/Scripts/Game/StateManager.cs:91)
DaggerfallWorkshop.Game.StateManager:SaveLoadManager_OnLoadHandler(SaveData_v1) (at Assets/Scripts/Game/StateManager.cs:122)
DaggerfallWorkshop.Game.Serialization.SaveLoadManager:RaiseOnLoadEvent(SaveData_v1) (at Assets/Scripts/Game/Serialization/SaveLoadManager.cs:1311)
DaggerfallWorkshop.Game.Serialization.<LoadGame>c__Iterator2:MoveNext() (at Assets/Scripts/Game/Serialization/SaveLoadManager.cs:1258)
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

l3lessed
Posts: 1400
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Need Assist on Saving Data to Save File

Post by l3lessed »

Well, the mod.SavedInterface object is accepting the interface class now without kicking out a compile error. It seems the way i was initiating the mod instance through the initparams was causing the issue for the serializer. I honestly don't know why, but resetting up how it is initialized to use the website documentation versus the post tutorial then moving the actual mod.SavedInterface into the awake method, so it doesn't connect until after the script initializes stopped the mod manager from kicking out a serializer error when using the interface method.

So, this is my recoded init method to initiate the mod instance and connect the script class to it.

Code: Select all

        [Invoke(StateManager.StateTypes.Game, 0)]
        public static void Init(InitParams initParams)
        {
            Debug.Log("main init");

            mod = initParams.Mod;
            var go = new GameObject(mod.Title);
            go.AddComponent<OutfitManager>();

            //after finishing, set the mod's IsReady flag to true.
            mod.IsReady = true;
        }
Here is the awake method that sets up and connects the interface to the mod instance initiated in the init method.

Code: Select all

        private void Awake()
        {
            SaveInterface saveInterface = new SaveInterface();
            mod.SaveDataInterface = saveInterface;
            MyModSaveData saveData = new MyModSaveData().Text;
            Debug.Log("Init Save Data: " + saveData.Text);
        }
I'm still not 100% sure how the value should be defined within the interface. Is it a standard local var, is it a private var, is it a property with a get, set? Right now, I setup up as a standard class var, and it isn't kicking errors out.

Code: Select all

string text;
Now, I just need to actually pull and retrieve these values between saves to see if it works properly. I'm having issues turning the MyModSaveData class object vars into usable vars or I'm actually not saving anything. I can't tell though, as I'm not getting any errors now. I just get a empty value readout when I use the below code to try and pump out the default value for the interface save class.

Code: Select all

            MyModSaveData saveData = new MyModSaveData().Text;
            Debug.Log("Init Save Data: " + saveData.Text);
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

l3lessed
Posts: 1400
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Need Assist on Saving Data to Save File

Post by l3lessed »

LOLS. This is really tripping me up. So, Still stuck at getting a readout for the vars. I went back and checked Lucas example, and rebuilt using his structure for the interface class. Again, it will run and accept the .SavedDataInterface.

However, when I call the main call value, it reads out blank when I do a debug.log readout of the var, even though the public methods and everything is setup. What am I missing? I know I am close. Here's the relevant code. I'll keep trying stuff.

Code: Select all

        #region Fields
        string text;
        int index;
        static Mod mod;
        #endregion
        
         #region Properties
        //sets up player entity class for easy retrieval and manipulation of player character.
        PlayerEntity playerEntity;

        public Type SaveDataType { get { return typeof(MyModSaveData); } }

        //sets up player class instance properties for manipulation.
        public PlayerEntity PlayerEntity
        {
            get { return (playerEntity != null) ? playerEntity : playerEntity = GameManager.Instance.PlayerEntity; }
        }
        #endregion
        
        
        [Invoke(StateManager.StateTypes.Game, 0)]
        public static void Init(InitParams initParams)
        {
            Debug.Log("main init");
            GameObject go = new GameObject("OutfitManager");
            OutfitManager instance = go.AddComponent<OutfitManager>();

            mod = initParams.Mod;
            mod.SaveDataInterface = instance;

            //after finishing, set the mod's IsReady flag to true.
            mod.IsReady = true;
        }
        
         private void Awake()
        {
            Debug.Log("Init Save Data: " + text);
        }

        #region Public Methods
        //KeyCode toggleClosedBinding;

        public object NewSaveData()
        {
            return new MyModSaveData
            {
                Text = "testing",
            };
        }

        public object GetSaveData()
        {
            if (string.IsNullOrEmpty(text))
                return null;

            return new MyModSaveData
            {
                Text = text,
            };
        }

        public void RestoreSaveData(object saveData)
        {
            var myModSaveData = (MyModSaveData)saveData;
            text = myModSaveData.Text;
        }
        #endregion
Can anyone hint at what I'm doing wrong when using these? Structure is setup, interface is setup, objects, types, and values are setup, .SavedInterfaceData is accepting the instance.

I just can't get the value to readout the default value set in Return new MyModSaveData Object. My understanding is the value set in that object will default the mod value the interface is tied to that value.

Does the mod settings method need setup for mod values to store on save? I see in lucas example, you have the mod setting deserializer setup. However, I wasn't setting it up, because I had no custom settings implemented yet. I merely want to store 2 basic vars.

Also, having the namespace impliemented within the .Game. space is okay?

Code: Select all

namespace DaggerfallWorkshop.Game.OutfitManager
{
    #region Types
    [FullSerializer.fsObject("v1")]
    public class MyModSaveData
    {
        public string Text;
    }
    #endregion

    public class OutfitManager : MonoBehaviour, IHasModSaveData
    {
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

User avatar
TheLacus
Posts: 1305
Joined: Wed Sep 14, 2016 6:22 pm

Re: Need Assist on Saving Data to Save File

Post by TheLacus »

It looks fine now. Try to make a save when your mod is enabled and reload it ;)

Code: Select all

public void RestoreSaveData(object saveData)
{
    var myModSaveData = (MyModSaveData)saveData;
    text = myModSaveData.Text;
    Debug.Log(text);
}

l3lessed
Posts: 1400
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Need Assist on Saving Data to Save File

Post by l3lessed »

It constantly pumps out null in the debug log when that is added to that void. It doesn't seem to be setting up my default values I put into the NewSaveData() object. If I do not define the string var text, it should default it to "testing" when the interface doesn't find save data, correct?

Lets make sure I'm not being dumb here. Save data should have permanency after the exe/game closes?
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

l3lessed
Posts: 1400
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Need Assist on Saving Data to Save File

Post by l3lessed »

Okay, I'm an idiot. I can confirm the data is saving just fine when I look in the save folder.

I must be calling it/restoring it the wrong way. Can you provide one quick example of how to Restore a specific save data object/value?


Well, it is working, outside two interesting bugs.

First is I can't restore my saved dictionary that contains an array of the items equipped. Any ideas on using saving a dictionary that contains arrays for the key values? I imagine this has to do with using an array item in a dictionary and trying to get the serialize to store and retrieve it without getting confused; the item objects seem to confuse the serialize because of how they reference themselves after being equipped. You can see it in the below mod saved data text file. It saves proper item template data on first outfit array, but afterwards each new outfit array starts shorthand referencing the items, which I think screws everything up on reload since the item uid item references are reset.

Code: Select all

{
    "OutfitDict": [
        {
            "Key": 0,
            "Value": [
                {
                    "shortName": "Shortsword",
                    "nativeMaterialValue": 0,
                    "dyeColor": "Iron",
                    "weightInKg": 2.5,
                    "drawOrder": 100,
                    "value": 15,
                    "unknown": 0,
                    "flags": 0,
                    "currentCondition": 300,
                    "maxCondition": 300,
                    "unknown2": 0,
                    "typeDependentData": 0,
                    "enchantmentPoints": 0,
                    "message": 0,
                    "legacyMagic": null,
                    "customMagic": null,
                    "stackCount": 1,
                    "poisonType": "None",
                    "timeHealthLeechLastUsed": 0,
                    "$id": "3"
                },
                {
                    "shortName": "Battle Axe",
                    "nativeMaterialValue": 1,
                    "dyeColor": "Steel",
                    "weightInKg": 7.5,
                    "drawOrder": 100,
                    "value": 120,
                    "unknown": 0,
                    "flags": 0,
                    "currentCondition": 1200,
                    "maxCondition": 1200,
                    "unknown2": 0,
                    "typeDependentData": 0,
                    "enchantmentPoints": 525,
                    "message": 0,
                    "legacyMagic": null,
                    "customMagic": null,
                    "stackCount": 1,
                    "poisonType": "None",
                    "timeHealthLeechLastUsed": 0,
                    "$id": "4"
                },
                null,
                null,
                null,
                {
                    "shortName": "Cuirass",
                    "nativeMaterialValue": 512,
                    "dyeColor": "Iron",
                    "weightInKg": 12.5,
                    "drawOrder": 50,
                    "value": 300,
                    "unknown": 0,
                    "flags": 0,
                    "currentCondition": 4096,
                    "maxCondition": 4096,
                    "unknown2": 0,
                    "typeDependentData": 0,
                    "enchantmentPoints": 0,
                    "message": 0,
                    "legacyMagic": null,
                    "customMagic": null,
                    "stackCount": 1,
                    "poisonType": "None",
                    "timeHealthLeechLastUsed": 0,
                    "$id": "5"
                },
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                {
                    "shortName": "Casual Pants",
                    "nativeMaterialValue": 0,
                    "dyeColor": "Blue",
                    "weightInKg": 0.5,
                    "drawOrder": 10,
                    "value": 5,
                    "unknown": 0,
                    "flags": 0,
                    "currentCondition": 150,
                    "maxCondition": 150,
                    "unknown2": 0,
                    "typeDependentData": 0,
                    "enchantmentPoints": 40,
                    "message": 0,
                    "legacyMagic": null,
                    "customMagic": null,
                    "stackCount": 1,
                    "poisonType": "None",
                    "timeHealthLeechLastUsed": 0,
                    "$id": "6"
                },
                null,
                null,
                null,
                null,
                {
                    "shortName": "Short Shirt",
                    "nativeMaterialValue": 0,
                    "dyeColor": "Purple",
                    "weightInKg": 0.5,
                    "drawOrder": 40,
                    "value": 5,
                    "unknown": 0,
                    "flags": 0,
                    "currentCondition": 100,
                    "maxCondition": 100,
                    "unknown2": 0,
                    "typeDependentData": 0,
                    "enchantmentPoints": 60,
                    "message": 0,
                    "legacyMagic": null,
                    "customMagic": null,
                    "stackCount": 1,
                    "poisonType": "None",
                    "timeHealthLeechLastUsed": 0,
                    "$id": "7"
                }
            ]
        }
    ],
    "Index": 0,
    "CurrentEquippedList": null,
    "Outfit0": [
        {
            "$ref": "3"
        },
        {
            "$ref": "4"
        },
        null,
        null,
        null,
        {
            "$ref": "5"
        },
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        {
            "$ref": "6"
        },
        null,
        null,
        null,
        null,
        {
            "$ref": "7"
        }
    ],
    "$version": "v1"
}
So, how do you save a dictionary that contains array values so the interface can restore it without an issue?

Second, is an interesting bug. The saved data won't load until you do a second saved game load after launching daggerfall program. It's seems the first save is maybe initiating the values, and the second save is loading the saved data now that the values have been initiated for the game instance.
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

User avatar
TheLacus
Posts: 1305
Joined: Wed Sep 14, 2016 6:22 pm

Re: Need Assist on Saving Data to Save File

Post by TheLacus »

l3lessed wrote: Sat Dec 21, 2019 2:42 am Okay, I'm an idiot. I can confirm the data is saving just fine when I look in the save folder.

I must be calling it/restoring it the wrong way. Can you provide one quick example of how to Restore a specific save data object/value?


Well, it is working, outside two interesting bugs.

First is I can't restore my saved dictionary that contains an array of the items equipped. Any ideas on using saving a dictionary that contains arrays for the key values? I imagine this has to do with using an array item in a dictionary and trying to get the serialize to store and retrieve it without getting confused; the item objects seem to confuse the serialize because of how they reference themselves after being equipped. You can see it in the below mod saved data text file. It saves proper item template data on first outfit array, but afterwards each new outfit array starts shorthand referencing the items, which I think screws everything up on reload since the item uid item references are reset.

Code: Select all

{
    "OutfitDict": [
        {
            "Key": 0,
            "Value": [
                {
                    "shortName": "Shortsword",
                    "nativeMaterialValue": 0,
                    "dyeColor": "Iron",
                    "weightInKg": 2.5,
                    "drawOrder": 100,
                    "value": 15,
                    "unknown": 0,
                    "flags": 0,
                    "currentCondition": 300,
                    "maxCondition": 300,
                    "unknown2": 0,
                    "typeDependentData": 0,
                    "enchantmentPoints": 0,
                    "message": 0,
                    "legacyMagic": null,
                    "customMagic": null,
                    "stackCount": 1,
                    "poisonType": "None",
                    "timeHealthLeechLastUsed": 0,
                    "$id": "3"
                },
                {
                    "shortName": "Battle Axe",
                    "nativeMaterialValue": 1,
                    "dyeColor": "Steel",
                    "weightInKg": 7.5,
                    "drawOrder": 100,
                    "value": 120,
                    "unknown": 0,
                    "flags": 0,
                    "currentCondition": 1200,
                    "maxCondition": 1200,
                    "unknown2": 0,
                    "typeDependentData": 0,
                    "enchantmentPoints": 525,
                    "message": 0,
                    "legacyMagic": null,
                    "customMagic": null,
                    "stackCount": 1,
                    "poisonType": "None",
                    "timeHealthLeechLastUsed": 0,
                    "$id": "4"
                },
                null,
                null,
                null,
                {
                    "shortName": "Cuirass",
                    "nativeMaterialValue": 512,
                    "dyeColor": "Iron",
                    "weightInKg": 12.5,
                    "drawOrder": 50,
                    "value": 300,
                    "unknown": 0,
                    "flags": 0,
                    "currentCondition": 4096,
                    "maxCondition": 4096,
                    "unknown2": 0,
                    "typeDependentData": 0,
                    "enchantmentPoints": 0,
                    "message": 0,
                    "legacyMagic": null,
                    "customMagic": null,
                    "stackCount": 1,
                    "poisonType": "None",
                    "timeHealthLeechLastUsed": 0,
                    "$id": "5"
                },
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                {
                    "shortName": "Casual Pants",
                    "nativeMaterialValue": 0,
                    "dyeColor": "Blue",
                    "weightInKg": 0.5,
                    "drawOrder": 10,
                    "value": 5,
                    "unknown": 0,
                    "flags": 0,
                    "currentCondition": 150,
                    "maxCondition": 150,
                    "unknown2": 0,
                    "typeDependentData": 0,
                    "enchantmentPoints": 40,
                    "message": 0,
                    "legacyMagic": null,
                    "customMagic": null,
                    "stackCount": 1,
                    "poisonType": "None",
                    "timeHealthLeechLastUsed": 0,
                    "$id": "6"
                },
                null,
                null,
                null,
                null,
                {
                    "shortName": "Short Shirt",
                    "nativeMaterialValue": 0,
                    "dyeColor": "Purple",
                    "weightInKg": 0.5,
                    "drawOrder": 40,
                    "value": 5,
                    "unknown": 0,
                    "flags": 0,
                    "currentCondition": 100,
                    "maxCondition": 100,
                    "unknown2": 0,
                    "typeDependentData": 0,
                    "enchantmentPoints": 60,
                    "message": 0,
                    "legacyMagic": null,
                    "customMagic": null,
                    "stackCount": 1,
                    "poisonType": "None",
                    "timeHealthLeechLastUsed": 0,
                    "$id": "7"
                }
            ]
        }
    ],
    "Index": 0,
    "CurrentEquippedList": null,
    "Outfit0": [
        {
            "$ref": "3"
        },
        {
            "$ref": "4"
        },
        null,
        null,
        null,
        {
            "$ref": "5"
        },
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        {
            "$ref": "6"
        },
        null,
        null,
        null,
        null,
        {
            "$ref": "7"
        }
    ],
    "$version": "v1"
}
So, how do you save a dictionary that contains array values so the interface can restore it without an issue?
I'm not aware of any issue with dictionaries. The snippet you posted is valid formatted json data with some content being referenced multiple times by id. The serializer used by Daggerfall Unity is a nice tool wich supports serialization by reference, meaning that class references are restored. This is intended behaviour. There are many null values in the dictionary so you probably want to check if its content is what you wanted it to be. This has nothing to do with saves. If you still need general help someone here on forums might be helpful, but after three pages i would like to consider this topic on save data to be solved. :)
l3lessed wrote: Sat Dec 21, 2019 2:42 am Second, is an interesting bug. The saved data won't load until you do a second saved game load after launching daggerfall program. It's seems the first save is maybe initiating the values, and the second save is loading the saved data now that the values have been initiated for the game instance.
When you load a save the game checks if a save file for a mod is available. If found, it loads it; otherwise it creates a new instance with NewSaveData(). In both cases RestoreSaveData() is then called with the custom content.

l3lessed
Posts: 1400
Joined: Mon Aug 12, 2019 4:32 pm
Contact:

Re: Need Assist on Saving Data to Save File

Post by l3lessed »

Thanks for all the clarification and assists. Guess I need to look at how the RestoreSaveData and how it is setting up my dictionary to restore the array values on load; right now it creates new blank arrays. Nice to know almost there, just have to fix how the values restore. Consider this topic closed.
My Daggerfall Mod Github: l3lessed DFU Mod Github

My Beth Mods: l3lessed Nexus Page

Daggerfall Unity mods: Combat Overhaul Mod

Enjoy the free work I'm doing? Consider lending your support.

Post Reply