The Contents of a Save
This guide is intended to give you some basic information about what is inside of your saves. This information can be useful for a lot of reasons: restoring backups, changing world settings, editing or deleting player information, or anything else you can think of. Some extreme examples include adding planets, adding or removing grids, and modifying grids and inventories. These extreme examples won't be covered here but the information provided should help with the more reasonable ones.
Version: | 0.6 |
Location
All Medieval Engineers saved data can be found inside of the AppData folder. By default this path is C:\Users\{username}\AppData\Roaming\MedievalEngineers\
. This path has a Windows shortcut of
%appdata%\MedievalEngineers
. This folder contains Blueprints, Maps, Mods, Saves, Screenshots, ShaderCache, Storage (used by mods), Workshop Worlds, Controls configuration (key bindings), Interface configuration (used by the general search screen for now), MedievalEngineers configuration, MedievalEngineers log, VRageRender-DirectX11 log. The Saves folder is of primary interest to this guide. Inside the Saves folder you will find numbered folders that correspond to each Steam account that has been used to play Medieval Engineers on your PC. Each sub-folder of these account folders is what we refer to as a save.
Folders and Files
Inside each save folder you will find the following:
Type | Name | Description |
---|---|---|
Folder | Backup | Contains backup saves. Each backup is a full copy of the save from an earlier state. These saves are identical in structure with the exception of not having their own backup folder. |
Folder | Players | Contains .player files. These files have information that is specific to each player who has joined the world. They are named by Steam ID. |
.vx2 File(s) | Voxel Modifications | This is generally one file, the planet, however the option exists to have multiple files if other bodies are added. vx2 files are compressed binary files that contain changes to the voxels. Planets are generated from maps in the game files specified by the scenario, modified by the scenario if needed, and then modified by the save. |
.sbc File | Configuration | The configuration file contains all of the settings for the world such as those specified in world settings and advanced world settings. Also contained is version information, player identities (Steam ID to character ID mapping), and general session information. |
.sbs | Save Data | This file contains all information about the save that is not in any of the other files. This contains all bot information, session components, Houses/ranks/deplomacy, banners, decay, fast travel cooldowns, farmables, access keys, areas, spawn information, and every entity (item, grid, character) in the world. |
.jpg | Thumbnail | A screenshot that is generated when the world is saved. This is automatically scaled to reduce file size. |
Players
Each of these files contains all information relevant to a single player in the world. Not all information generated by the player is saved in this file. What is included in the file is actually determined by the game architecture in that any entity component used by the character will serialize data to this file.
Annotated player file |
---|
<?xml version="1.0" encoding="utf-8"?> <!-- This file is XML: don't touch -->
<MyObjectBuilder_PlayerStorage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- This is the XML schema information: don't touch -->
<PlayerId>00000000000000000</PlayerId> <!-- Steam Account ID number. Used to tie players to their characters. -->
<IdentityId>144115188075855873</IdentityId> <!-- Character identity ID number. Used to tie players to their in-game identities. Identities are tied to actual in-game entities. This allows for things like permadeath and character substitution -->
<Entity xsi:type="MyObjectBuilder_EntityBase" Subtype="Medieval_male"> <!-- All information from the character entity in the game world. Subtype: the character object, this determines not only the skin but also all of the components used by the character. For example, bots don't have controllers and first person camera, but they do have AI components -->
<EntityId>102663082422568315</EntityId> <!-- Every entity in the world has a unique ID. The character entity ID is used to tie it to the player's identity. -->
<PersistentFlags>CastShadows InScene</PersistentFlags> <!-- A standard tag that provides flags for the game engine about the entity: don't touch unless you are modding -->
<PositionAndOrientation> <!-- The character's position and orientation in the world -->
<Position x="-1567.5491823382526" y="2926.590176047639" z="3948.1319302078973" /> <!-- 3D position coordinates -->
<Forward x="-0.3501615" y="-0.8136604" z="0.464051" /> <!-- 3D vector of forward orientation -->
<Up x="-0.30410704" y="0.567332" z="0.76527977" /> <!-- 3D vector of up orientation -->
</PositionAndOrientation>
<ComponentContainer> <!-- Characters are componentized, meaning they are made of up multiple components. This container is where data is serialized from those components -->
<Component xsi:type="MyObjectBuilder_ModelComponent"> <!-- Data from the character model -->
<ColorMask x="0.35" y="1" z="-0.79" /> <!-- Color -->
<DisplayName>CptTwinkie</DisplayName> <!-- Name -->
</Component>
<Component xsi:type="MyObjectBuilder_ThirdPersonCameraComponent" Subtype="DefaultThirdPerson"> <!-- Default settings used by the 3rd person camera -->
<Pitch>0</Pitch> <!-- angle above/below the character -->
<Yaw>0.00179405953</Yaw> <!-- angle of rotation away from behind center -->
<Distance>2.05177784</Distance> <!-- distance from the character -->
<TargetOffset> <!-- offset position from the character model origin point. this model's origin is at the feet, so we offset to put the camera at head level -->
<X>0</X>
<Y>1.9374498128890991</Y>
<Z>0</Z>
</TargetOffset>
<FrameOffset> <!-- TO DO -->
<X>0.000216474233</X>
<Y>0</Y>
</FrameOffset>
</Component>
<Component xsi:type="MyObjectBuilder_FirstPersonCameraComponent" Subtype="DefaultFirstPerson"> <!-- Default settings used by the first person camera -->
<Pitch>0.0441527255</Pitch> <!-- -->
</Component>
<Component xsi:type="MyObjectBuilder_AreaInventoryAggregate" Subtype="NearbyInventories"> <!-- Settings for area inventory -->
<Radius>12</Radius> <!-- radius of area to scan for inventories -->
</Component>
<Component xsi:type="MyObjectBuilder_EntityEquipmentComponent" /> <!-- -->
<Component xsi:type="MyObjectBuilder_AreaInventory" Subtype="Ground" /> <!-- -->
<Component xsi:type="MyObjectBuilder_CharacterStatComponent"> <!-- -->
<Stats> <!-- -->
<MyObjectBuilder_EntityStat Subtype="Health"> <!-- -->
<Value>1</Value> <!-- -->
<MaxValue>1</MaxValue> <!-- -->
<StatRegenAmountMultiplier>1</StatRegenAmountMultiplier> <!-- -->
<StatRegenAmountMultiplierDuration>0</StatRegenAmountMultiplierDuration> <!-- -->
</MyObjectBuilder_EntityStat>
<MyObjectBuilder_EntityStat Subtype="Stamina"> <!-- -->
<Value>1</Value>
<MaxValue>1</MaxValue>
<StatRegenAmountMultiplier>1</StatRegenAmountMultiplier>
<StatRegenAmountMultiplierDuration>0</StatRegenAmountMultiplierDuration>
</MyObjectBuilder_EntityStat>
<MyObjectBuilder_EntityStat Subtype="Food"> <!-- -->
<Value>0.465</Value>
<MaxValue>1</MaxValue>
<StatRegenAmountMultiplier>1</StatRegenAmountMultiplier>
<StatRegenAmountMultiplierDuration>0</StatRegenAmountMultiplierDuration>
</MyObjectBuilder_EntityStat>
</Stats>
<ScriptNames> <!-- -->
<string>MedievalStatEffect</string> <!-- -->
</ScriptNames>
<ImmunityTicks>0</ImmunityTicks> <!-- -->
</Component>
<Component xsi:type="MyObjectBuilder_CraftingComponentQueued"> <!-- -->
<CurrentProduction xsi:nil="true" /> <!-- -->
<CurrentCrafterId>-1</CurrentCrafterId> <!-- -->
<CurrentProductionDuration>1000</CurrentProductionDuration> <!-- -->
<CurrentProductionTimeRemaining>601966224</CurrentProductionTimeRemaining> <!-- -->
<ProductionQueue /> <!-- -->
</Component>
<Component xsi:type="MyObjectBuilder_QuestEntityComponent"> <!-- -->
<CompletedQuest QuestSubtypeId="EconomicSmelting" CompletionTimestamp="1511722408" /> <!-- -->
...
<ActiveQuest Subtype="HungryBellies"> <!-- This contains the current state of the active quest. -->
<!-- The working of quests won't be covered here. For additional information about quest conditions see Official Content/Research Quests -->
...
</ActiveQuest>
<IsInitialQuestChecked>true</IsInitialQuestChecked> <!-- -->
</Component>
<Component xsi:type="MyObjectBuilder_InventorySpawnComponent" /> <!-- -->
<Component xsi:type="MyObjectBuilder_CombatComponent" /> <!-- -->
<Component xsi:type="MyObjectBuilder_Inventory" Subtype="Internal"> <!-- -->
<Item xsi:type="MyObjectBuilder_HandItem" Subtype="PickaxeIron" ItemId="4" Quantity="1" Durability="1" /> <!-- -->
<Item xsi:type="MyObjectBuilder_BlockItem" Subtype="TimberRound10" ItemId="204" Quantity="2">
<ObjectBuilderType>MyObjectBuilder_CubeBlock</ObjectBuilderType> <!-- -->
</Item>
<NextItemId>482</NextItemId> <!-- -->
<InventoryFlags /> <!-- -->
</Component>
<Component xsi:type="MyObjectBuilder_FlightComponent"> <!-- -->
<Enabled>false</Enabled> <!-- -->
</Component>
<Component xsi:type="MyObjectBuilder_EntityStateComponent"> <!-- -->
<CurrentState>NormalMode</CurrentState> <!-- -->
</Component>
</ComponentContainer>
</Entity>
<Toolbar> <!-- -->
<ToolbarType>Character</ToolbarType> <!-- -->
<SelectedSlot xsi:nil="true" /> <!-- -->
<Slots> <!-- -->
<Slot Index="0"> <!-- -->
<Data xsi:type="MyObjectBuilder_ToolbarItemCubeBlock">
<DefinitionId Type="MyObjectBuilder_CubeBlock" Subtype="Windmill" />
</Data>
</Slot>
...
<Slot Index="72">
<Data xsi:type="MyObjectBuilder_ToolbarHandItem">
<DefinitionId Type="MyObjectBuilder_HandItem" Subtype="HammerIron" />
<ItemId>195</ItemId>
</Data>
</Slot>
</Slots>
</Toolbar>
</MyObjectBuilder_PlayerStorage>
|