
Vintage Story Mod DB · Vintage Story mod
By Aethereal Artifice
A preview of what this library can do is available here: Preview Video This is the first blush of a library I've been talking about releasing for a long while. Currently, it contains one important tool that many modders may want access to. An (arguably insan
Quick answer
Which By Aethereal Artifice release matches 1.22.3?
By Aethereal Artifice 0.2.0-dev.4 targets 1.22.0, 1.22.1, 1.22.2. It must be installed on the client. Installation on the dedicated server is optional. No extra mods listed for this file.
Where it goes
Is By Aethereal Artifice required on the client, server, or both?
It must be installed on the client. Installation on the dedicated server is optional.
This release supports both sides, but the source does not require it on the server.
What else does By Aethereal Artifice 0.2.0-dev.4 need?
0.2.0-dev.4 on 1.22.3. Every mod below is checked against that same setup.
This file does not list any required mods. Do not add a library just because a different file uses it.
This file does not list any required or optional mods.
Before you install it
Add By Aethereal Artifice without breaking your instance.
Built for By Aethereal Artifice 0.2.0-dev.4 on 1.22.3. Pick another file and the loader, install side or required mods may change.
- 01
Stick to this file
Use 0.2.0-dev.4. It targets 1.22.0, 1.22.1, 1.22.2; another release may have different loader, side or dependency requirements.
- 02
Bring the mods it needs
This file does not list any required mods. Do not add a library just because a different file uses it.
- 03
Put it on the correct side
It must be installed on the client. Installation on the dedicated server is optional.
- 04
Pick the file you checked
Use the “Get this file” button beside 0.2.0-dev.4. It opens that exact file at the source.
About this project
What does By Aethereal Artifice add?
A preview of what this library can do is available here:
Preview Video
This is the first blush of a library I've been talking about releasing for a long while. Currently, it contains one important tool that many modders may want access to.
An (arguably insanely robust) In-World crafting system driven by Ground Storage.
The trailer video demonstrates quite a bit of what the behavior is capable of, and it now includes the option to replace the block under the ground storage as its output (for in-world path-making, for instance).
The premier part of this is ALCMyCollectibleBehaviorGroundStoredProcessable. You add it as a behavior, just like any other. Examples can be found in the Examples folder inside the mod. Note that it's important to put it *before* GroundStorable in the list of behaviors.
I'll expand on this explanation later, but the following set of information should give a pretty good idea of what it can do and what options are available to the user.
string Name = "unnamed"; //The name of the process. This must be set to something other than unnamed or the process will not be loaded.
string FromModID = "modidnotprovided"; //The mod that the process is patched in from. This must be set to something other than modidnotprovided or the process will not be loaded. Please use your mods modID.
float ProcessTime = 4; //Time in seconds the process takes to complete.
BlockDropItemStack[] ProcessedStacks = null; //The BlockDropItemStacks created when the process completes. These will either be given to the player or spawned accourding to TryGiveItemStacks first.
bool TryGiveProcessedStacksFirst = false; //Whether the process should attempt TryGiveItemStack before spawning items in the world. False is juicier.
AssetLocation ProcessingSound = ""; //The sound that will be played at every target frame.
AssetLocation CompletionSound = ""; //The sound that will play when the process is finished.
float ProcessingAnimationTargetFrame = 0f; //The frame of the animation that sound and particles will play. Will also be the frame that the process ends on after ProcessTime is reached.
string ProcessingAnimationCode = "knifecut"; //The animation that will play while the process is being performed.
JsonItemStack RemainingItem = null; //A Collectible that should be attempt to be placed back in the groundStorage. Think scraped hides in vanilla.
int ConsumedGroundStorageStackQty = 1; //How many items are consumed from the target GroundStorage slot.
bool ExactGroundStorageStackQtyRequired = false; //Requires ground storage to have exact number of required items.
bool ExactOrGreaterThanStorageQtyRequired = false; //Requires ground storage to have exact number of items or more. Useful for processes that can impact multiple stacksizes (Think small hides and fat.)
bool PlaceRemainingItemAsBlock = false; //Replaces ground storage with RemainingItem if item is block and GroundStorage Inventory is empty at process completion.
//bool ReplaceSurfaceBlock = false; //Replaces block under ground storage with output block, PlaceRemainingItemAsBlock must be true, and RequiredSurfaceMaterials or RequiredCraftingSurfaceByTag must be set.
bool OffHandMustBeEmpty = false; //Whether the players offhandslot must be empty to do this process.
bool MainHandMustBeEmpty = false; //Whether the player activehotbarslot must be empty to do this process.
string[] RequiredClassTraits = null; //What traits are required for the player to have access to this process.
EnumTool? Tool { get; set; } = null; //Tools that count for this process. Can be set instead of or in addition to the PRocessingItemByCode/Tag values.
int toolDamage = 1; // The amount of durability damage the tool in the mainhand takes when the process completes.
EnumTool? ToolOffhand { get; set; } = null; //Tools that count for this process. Can be set instead of or in addition to the PRocessingItemByCode/Tag values.
int toolOffhandDamage = 1; // The amount of durability damage the tool in the mainhand takes when the process completes.
JsonItemStack[] MainHandProcessingItemsByCode = null; //An array of JSON ItemStacks that are valid for using during this process. One of these must be held in the main hand, can be null/empty.
JsonObject[] MainHandProcessingItemsByTag = null; //An array of tags that the item must have to be used as a processingItem for this. This is separate from ByCode, they will not require both a code and the correct key. Can be null/empty.
JsonItemStack[] OffHandProcessingItemsByCode = null; //An array of JSONItemStacks that are valid for use during this process. One of these must be held in the off hand. Can be null/empty.
JsonObject[] OffHandProcessingItemsByTag = null; //An array of tags that the item must have to be used as a processingItem for this. This is separate from ByCode, they will not require both a code and the correct key. Can be null/empty.
ModifyProcessTimeByMainHandALCMyCraftingToolTier = false; //Whether the alcmytooltier of the tool adjusts the processtime.
MainHandToolTierProcessTimeMod = new float[] {1.20f, 1f, 0.875f, 0.750f, 0.625f, 0.50f }; //modifier per tier. Default for tools is [1], so a modifier of 1f (No modifier at all)
ModifyProcessTimeByOffHandALCMyCraftingToolTier = false; //Whether the alcmytooltier of the tool adjusts the processtime.
OffHandToolTierProcessTimeMod = new float[] {1.20f, 1f, 0.875f, 0.750f, 0.625f, 0.50f }; //Process speed modifier per tier. Default is toolTier 1, so a modifier of 1f (No modifier at all)
Be aware the above two modifiers are cumulative if you use both. It will adjust the process time by the alcmytooltier of the mainhand, then the offhand.
bool transferFreshness = false; //Whether the process should attempt to transferFreshness values from the ingredient to the output.
String[] RequiredCraftingSurfaceByTag = null; //An array of tags the block under the groundstorage must have to be a valid surface for this process.
EnumBlockMaterial[] RequiredSurfaceMaterials = null; //An array of EnumBlockMaterial the block under the groundstorage must have to be a valid surface for this process.
EnumBlockMaterial[] RequiredImmersedInMaterials = null; //An array of EnumBlockMaterial the block the groundstorage must be immersed in for the process to be valid.
EnumBlockMaterial[] RestrictedImmersedInMaterials = new EnumBlockMaterial[] { EnumBlockMaterial.Water, EnumBlockMaterial.Lava }; //An array of EnumBlockMaterial the block the groundstorage cannot be immersed in for the process to be valid.
EnumEntityAction[] RequiredActions = {EnumEntityAction.Sprint}; //An array of EnumEntityActions the player must be doing for this process to be valid.
string craftingSurfaceErrorLangCode = ""; //The error message that is shown if the block under the groundStorage doesn't meet requirements for the process.
string surfaceErrorLangCode = ""; //Error message shown when the block under the ground storage has the wrong Material type.
string interactionHelpCode = ""; (For Handbook Integration. Not implemented yet)
string handbookProcessIntoTitle = ""; (For Handbook Integration. Not implemented yet)
string handbookCreatedByTitle = ""; (For Handbook Integration. Not implemented yet)
Feel free to take it, break it, and ask any questions you may have.
Project description from Vintage Story Mod DB.
Pick your setup
By Aethereal Artifice releases for each Vintage Story version.
Choose the version and loader you play, then open the matching release.
1.22.2
1 loader build1.22.1
1 loader build1.22.0
1 loader buildCheck the dependencies, then try the file in a copied instance before changing a world you care about.
Recent files
By Aethereal Artifice versions and loaders
0.2.0-dev.4
alcmycore-1.22-v0.2.0-dev.4.zip
14 Jun 2026
Looking for an older file? The official Vintage Story Mod DB project page is in Resources.