Моддинг в Bannerlord: Система сохранений
Оригинал статьи - https://docs.bannerlordmodding.com/_csharp-api/savesystem/
ВНИМАНИЕ!
Для патча e1.0.10/e1.1.0 при установке кастомных данных, содержащих основные модели игры, будьте предельно внимательны.
Если данные будут сохранены непосредственно в папку с самим модом, то при удалении мода сохранение не загрузится из-за отсутствия ваших кастомных данных.
Это будет иметь место при определении кастомных LogEntry моделей и введении их в игру
(LogEntry.AddLogEntry(customLog);.
В качестве обходного пути вы должны либо включить функцию для полного вынесения кастомных данных из игры, или предоставить для этого мод.
SaveableTypeDefiner
Для определения пользовательских классов и структур выполните ваш собственный TaleWorlds.SaveSystem.SaveableTypeDefiner
Вам не нужно нигде его регистрировать, игра сама его найдёт.
public class CustomSaveDefiner : SaveableTypeDefiner
{
// use a big number and ensure that no other mod is using a close range
public CustomSaveDefiner() : base(2 _333_000) { }
protected override void DefineClassTypes()
{
// The Id's here are local and will be related to the Id passed to the constructor
AddClassDefinition(typeof(CustomMapNotification), 1);
AddStructDefinition(typeof(ExampleStruct), 2);
AddClassDefinition(typeof(ExampleNested), 3);
AddStructDefinition(typeof(NestedStruct), 4);
}
protected override void DefineContainerDefinitions()
{
ConstructContainerDefinition(typeof(List<ExampleStruct>));
}
}
SaveableField и SaveableProperty
Чтобы выделить данные в ваших пользовательских класс/структура как сохраняемые используйте TaleWorlds.SaveSystem.SaveableFieldAttribute и TaleWorlds.SaveSystem.SaveablePropertyAttribute.
Похоже, что нет разницы между SaveableField и SaveableProperty, но если вы использовали один из них, придерживайтесь его. Они не взаимозаменяемые и данные не загрузятся, если их поменяли.
public struct ExampleStruct
{
// Local ID's start from one if the class/struct does not inherit from any
// game's types with saveable data
[SaveableField(1)]
public PartyBase Attacker;
}
public class CustomMapNotification : InformationData
{
// InformationData already contains 5 definitions, so start from 6 for custom data
[SaveableProperty(6)]
public Hero Mercenary { get; set; }
[SaveableProperty(7)]
public bool IsHandled { get; set; }
}
public struct NestedStruct
{
[SaveableField(1)]
public bool Flag;
}
public class ExampleNested
{
[SaveableField(1)]
public NestedStruct Data;
}
CampaignBehaviorBase.SyncData
Есть также «общая база данных», которую можно использовать между одним/несколькими CampaignBehaviorBase. С ней вы сможете хранить такие кастомные данные, как:
- Array (массив)
- List (список)
- Dictionary (словарь)
- Queue (Очередь (FIFO ("первый вошел - первый вышел")))
public class CustomBehavior : CampaignBehaviorBase
{
private List<ExampleStruct> _customDataMap = new List<ExampleStruct>();
public override void SyncData(IDataStore dataStore)
{
dataStore.SyncData("customDataMap", ref _customDataMap);
}
}
Заметки:
Сообщество теперь должно решить как справиться с противоречиями saveBaseId.
Комментариев 1
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.