Skip to content

SyncDataAsJson not working #442

@DrSalzstreuer

Description

@DrSalzstreuer

Hey, the JSON based Sync-System for Bannerlords 1.3 (BETA) together with Bannerlord.ButterLib/2.10.0 is having issues.
Below an example how I use it and the serialized data always is a empty String and the deserialized one is null.

https://butterlib.butr.link/articles/SaveSystem/Overview.html

internal class RevoltCampaignBehavior(CampaignGameStarter CampaignGameStarterObject) : CampaignBehaviorBase
{
  private RevoltSaveData _revoltSaveData = new();

  internal Kingdom? RandomLuckyNation { get; private set; }
  internal Kingdom? ImperialLuckyNation { get; private set; }
  internal Kingdom? NonImperialLuckyNation { get; private set; }
  internal Dictionary<Settlement, IFaction> SettlementsPreviousFaction { get; } = new();

  public override void RegisterEvents()
  {
  	CampaignEvents.OnSessionLaunchedEvent.AddNonSerializedListener(this, OnSessionLaunched);
  	CampaignEvents.OnClanChangedKingdomEvent.AddNonSerializedListener(this, OnClanChangedKingdom);
  }

  public override void SyncData(IDataStore dataStore)
  {
  	if (dataStore.IsSaving)
  	{
  		_revoltSaveData.RandomLuckyNation = RandomLuckyNation;
  		_revoltSaveData.ImperialLuckyNation = ImperialLuckyNation;
  		_revoltSaveData.NonImperialLuckyNation = NonImperialLuckyNation;
  		_revoltSaveData.SettlementsPreviousFactionId = SettlementsPreviousFaction.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.StringId);

  		dataStore.SyncDataAsJson(nameof(RevoltCampaignBehavior), ref _revoltSaveData!);
  	}
  	else
  	{
  		dataStore.SyncDataAsJson(nameof(RevoltCampaignBehavior), ref _revoltSaveData!);

  		RandomLuckyNation = _revoltSaveData.RandomLuckyNation;
  		ImperialLuckyNation = _revoltSaveData.ImperialLuckyNation;
  		NonImperialLuckyNation = _revoltSaveData.NonImperialLuckyNation;

  		SettlementsPreviousFaction.Clear();

  		foreach (var settlementPreviousFactionId in _revoltSaveData.SettlementsPreviousFactionId)
  		{
  			var settlement = settlementPreviousFactionId.Key;
  			var factionStringId = settlementPreviousFactionId.Value;
  			
  			var faction = Campaign.Current.Factions.FirstOrDefault(faction => faction.StringId == factionStringId);
  			if (faction is not null)
  			{
  				SettlementsPreviousFaction[settlement] = faction;
  			}
  		}
  	}
  }
}

using TaleWorlds.CampaignSystem;
using TaleWorlds.CampaignSystem.Settlements;
using TaleWorlds.SaveSystem;

namespace Bannerlord.RevolutionsReloaded.Components.Revolts.SaveData;

[Serializable]
internal class RevoltSaveData
{
  [SaveableField(1)]
  public Kingdom? RandomLuckyNation;
  
  [SaveableField(2)]
  public Kingdom? ImperialLuckyNation;
  
  [SaveableField(3)]
  public Kingdom? NonImperialLuckyNation;
  
  [SaveableField(4)]
  public Dictionary<Settlement, string> SettlementsPreviousFactionId = new();
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions