Repository navigation
Releases
Kiln 0.2.0-dev.26
Kiln 0.2.0-dev.26
The first of the releases that complete the mod API: data that stays with one item, weapons with attacks of their own, typed reads of the game's data, offline tests for mods, and a launcher that can move its data folder to another drive. Almost all of it works on test servers and in Kiln's tests. One session in a real game (Linux, Proton, one player on a test server) has seen the launcher and the game start, item data, mod creatures and the sample weapons' own attacks; the rest waits for a game test (see "Known limits").
Mod authors
- Lab and test members are a build error now (KILNX001). About 120 of Kiln's lab and test helpers that shipped in 0.2.0-dev.24 (
Rules.Simulate,QuestInput,Knowledge.LabRecord,GameTree.Simulateand theLab*members,CreatureRef.ForceReadyand others) are now[Experimental("KILNX001")]and hidden from completion. A project that calls one no longer builds until it adds<NoWarn>$(NoWarn);KILNX001</NoWarn>to its project file. Mods that are already built are not affected and keep loading. In a mod players install, use the documented API instead. Details:docs/kiln/modding/analyzers.md#kilnx001. - The mod API is 0.2.1.
Mods.RuntimeApiVersionsays 0.2.1, and a mod built with this release's MDK asks for API 0.2.1 by default (KilnApiVersion), so it needs a 0.2.0-dev.26 runtime or newer; earlier Kilns refuse it. Mods that ask for 0.2 or 0.1 keep loading. Everything new is additive: no public member of 0.2.0-dev.25 was removed or changed, and Kiln's build now fails when shipped API is removed or changed. API marked[Experimental("KILNX…")]may still change.Mods.ApiVersionis obsolete (its value is copied into your mod at build time); readMods.RuntimeApiVersion.
Data on one item
InstanceData.Key<T>("name")anditem.Get(key)keep a value on one particular item through moves, saves, crashes and restored backups. Items in chests work on a test server; items in a player's inventory wait for the guided client pass. Samplemods/samples/ItemData.- When Kiln cannot tell which of two identical items a value belongs to, it sets the value aside and reports it (
InstanceData.Parked,/instances). Two identical items swapped where Kiln did not see it (another world, an offline edit) trade their values. - Inventory reads and the results of give, take and move carry a
Refnaming one item;Items.Held,Items.Equippedanditem.Location()say where it is, andItemMovedEventreports moves. Persist.Carried(values that travel with a character between worlds) is not in this release.
Player animation states and weapon moves
- Weapons can have player animation states of their own: list them in
assets/player-states.json, each placed like a game attack, block, dodge, cast or shot state, and Kiln adds every mod's states to the player's animation graph at start. Changes apply from the next start.PlayerAnimStates(new libraryKiln.PlayerAnim) looks states up;kiln lintand the cook check the file. Samplemods/samples/PlayerStates. - A mod can no longer replace the player's animation graph:
Assets.OverrideandAssets.Registerthrow for its key, and anassets.jsonentry for it is refused at boot with a kiln.log line. - Weapon blocks take
Moves: per attack slot a state to play (a mod's state or a game state by name, or a GUID), the sequence it starts from, when the blow lands (HitAt) and how long it lasts, with primary and heavy chains. Wand attacks and staff spells takeAnimationandHitAton their premade motion. Samplemods/samples/WeaponMoves. - The
PlayerStatesandWeaponMovessamples build each move on the game's own clip of the state it is placed like and replace only the sword arm ("from"plus"blend"with"bones"), so the body moves as in the game's attack; a clip that animates the arm alone leaves the rest of the body in the skeleton's bind pose.PlayerStatesships its motion as a glTF of its own rig, so its release zip cooks with onekiln cookand no other step.mods/samples/check_player_clips.pychecks cooked clips against the game's. - A clip in
cook.jsoncan be made from another clip at cook time with"from": trim, reverse, speed, mirror, blend, joint offsets. A reworked game clip is made on each player's machine and never ships. - A look takes
Animated: a skinned model with its graph, held in the class's hand. A dedicated server needs no cooked files for it; where nothing is cooked the rigid model stands in. - On a dedicated server that has not cooked your mod, items whose look names a model of your mod no longer log "is not a keen::Model the game has loaded".
The API contract
Kiln.Capabilities(Is,Get,Why,All) says what works on this game build and side, and why not;CapabilityChangedEventreports changes, andGame.HasFeatureasks the same table. Native plugins report rows of their own and follow changes throughkiln.caps.- A manifest whose
featuresname something unavailable is refused with the reason. Name only capabilities fixed at boot there; check the others withCapabilities.Isat run time. EntityRef,ItemInstanceRefandPlayerRefremember which spawn an id belonged to, soIsAlivecan tell when the game reused the id; they answer from the first tick, not inOnLoad.PlayerRefconverts fromPlayer,TalentHolder,QuestHolderandCharacterKey.- One error rule (
docs/kiln/modding/contract.md): the game's refusal comes back asOk = falsewith a reason, a bad argument throwsArgumentException, and a capability that is off throwsKilnUnavailableException, which names it and is still aNotSupportedException. [ServerOnly],[ClientOnly],[AnyThread],[RenderThread]and[WorkerThread]mark members.ItemIdmoved to Kiln.Api; mods built against older SDKs load unchanged.- Release builds carry their full version (
0.2.0-dev.26), and the release folder holds the SDK as a NuGet feed folder (sdk/feed/), so akilndependency can name a dev build. The feed is published with this release for the first time: NuGet sourcehttps://frostdev.io/kiln/downloads/0.2.0-dev.26/sdk/feed/index.json.
Typed game data
- Kiln.Game has typed structs for every ECS component and event of the game under
Kiln.Ecs(Ecs.Health,Ecs.NpcCommon), generated from the game's own reflection. PutGameinKilnServicesand read withEcs.TryGet<Ecs.Health>(entity, out var h). Reads only; writes stayWorld.TryWritefor now. - Each type is checked against the running game before its first read; a mismatch reads as nothing with one warning (
Ecs.WhyNot<T>()). A mod using the types getskiln.gametypes.jsonat build and is refused by name at load when a type it uses changed. An enum constant the compiler folds into a number is not checked. Kiln.GameTypes.Components,ComponentTypesand the nine old structs still work and are obsolete.
Testing
- Test a mod under
dotnet testwith no game:dotnet new kiln-unit-test --mod ../MyMod/MyMod.csprojmakes an xunit project onKiln.TestKit, which loads the mod through Kiln's real loader, steps the server, fakes players and saved data and runs your[KilnTest]methods. A test that needs something the kit does not fake is skipped with its name;docs/kiln/modding/unit-tests.mdlists what is real offline. A[KilnTest]that blocks the tick thread is stopped and reported with the stack where it blocked (tested on Linux). - Guided client checks: mark an async method
[ClientCheck("area.slug", "Title")]and callClientChecks.Register(this)inOnLoad. A player plays the check and the verdict lands inkiln/state/client-checks.json.
Advanced mods and hooks
- These raw entry points now throw
InvalidOperationExceptionunlesskiln.mod.jsonhas"advanced": true:OriginalCode.Read,FindUnique,TryFindUnique,Keep.Block,Keep.Span,Arsenals.JobHandler,Is.Job,Act.Job,Abilities.Programs.Register,NativeCall.Bytes. - Re-installing a
Hooks.DetourorHooks.Midby the same mod on the same function, also after a hot reload, reuses its link slot instead of using up a new one. A mod that has unloaded can no longer install hooks. Arsenals.RulesState(ArsenalRulesStatus) replacesArsenals.Status, whose type had the same name as Kiln.Rules' record; the old ones still work.Kiln.SteamGuard(experimental,KILNX002) is meant to stop the game client reporting achievements to Steam while it is latched or held. It has not run in a real client.- Native plugins:
on_unloadis called once at a normal exit with code 0, last loaded first, with a fault guard and a 3 s limit. Works for a dedicated server stopped under Wine, and at a game client's quit under Proton (seen once: 11 handlers in 9 ms). On native Windows it is off unlesskiln.jsonhas"unloadAtExit": "on". It is not called when the process is killed or crashes. - After moving Kiln's data folder, delete a native mod project's
buildfolder once: CMake remembers the old SDK path.
Fixes and docs
- Creature blocks defined in
OnLoadkeep their own faction relations and sense filter again, andFactions.RelateandBlocks.SenseFiltercalls made inOnLoadstay in force; 0.2.0-dev.24's first server step dropped them. docs/kiln/modding/limits.mdlists what a mod cannot do yet: missing and limited APIs, hard caps with their values, problems seen in the game, and the release each is planned for.- The API reference and the modder's guide build as a site into the release's
sdk/api/, with each member's thread and side. It is published with this release for the first time:https://frostdev.io/kiln/downloads/0.2.0-dev.26/sdk/api/. New pages for capabilities (services/caps.md), player animation states (services/playeranim.md) and the achievement guard (services/steamguard.md).
Players
- Move Kiln's data folder. Settings, Library, Data folder, Ch...
Kiln 0.2.0-dev.25
Kiln 0.2.0-dev.25
A hotfix for 0.2.0-dev.24: ShroudForge mods and EML mods together, XHL mods, Skill Search's search box, and a launcher window that stayed black on some Linux machines.
Players and server owners
- ShroudForge's data mods apply again next to EML mods. 0.2.0-dev.24 made EML mods run when a ShroudForge mod is on. With More Gliders and Unlock Blueprints together, ShroudForge then refused one write of Unlock Blueprints and threw away its whole startup pass, so no data mod applied at all (Crafting Essentials, Unlock Blueprints, More Gliders and the other EML mods). ShroudForge (Kiln's build of 1.7.9) now checks a write into a value a mod created against that field's own type, which is what Unlock Blueprints' write is; Kiln's own EML runner had the same mistake and has the same fix. Seen in a game (Linux, Proton): Unlock Blueprints updated 2544 recipes, the startup pass completed, ShroudForge's mods' shortcuts work, and ShroudForge, EML, Greeneye, shroudlink, native DLL and Kiln mods loaded and worked together.
- XHL mods import again. XHL's mods since November carry a
mod.jsonthat only names the mod. Kiln took that file for a broken EML mod, left the mod out and said "Nothing to add". Such a folder is now an XHL-Core plugin, placed in the game'smodsfolder with every file it came with, where XHL-Core loads it. A hand-installed XHL mod in the game folder is shown as an XHL plugin instead of "Can't run". - XHL-Core 2.x is recognised. The launcher said XHL-Core was missing while it was installed, and every download of it became one more mod. It is now one mod, "xhl-core", whose next version replaces it.
- XHL-Core starts its XHL mods under Kiln. Kiln chain-loaded XHL-Core under its file name,
dinput8.dll, next to Kiln's owndinput8.dll. XHL-Core then took itself for the game's maindinput8.dlland waited for a call that only ever reaches Kiln's, so none of its plugins started and "XHL Mod Settings" never appeared (seen under Proton). Kiln now runs XHL-Core from its own copy namedxhl-core.dllin the game'skiln\chain\folder, where it hooks in behind Kiln the way it does behind any other loader. Nothing to rename or move: open the launcher once (or press Play there) so it places the copy; XHL-Core's log is then next to it, inkiln\chain\<its id>\XHL-Native-Plugin-Host.log. - Skill Search's search box is back. Skill Search ships its EML part and the Shroudtopia module that draws the search box (its page says "Requires Shroudweave") in one folder. Kiln's Shroudtopia runner left out every folder that also holds an EML part, so the box never showed. Such a folder now gets its Shroudtopia module loaded, and only DLLs that are Shroudtopia modules.
- A black launcher window on Linux. On some machines (one report: NVIDIA, X11) the launcher's window stayed black. The launcher now notices when its page has not come up 15 seconds after the window opened, starts again without the GPU by itself, and keeps doing so at later starts. Settings > Appearance > "Draw the launcher without the GPU" turns this on or off;
--software-render(orKILN_LAUNCHER_RENDER=software) forces it for one start,--gpu-renderthe other way. Started from a terminal, the launcher's first line names its log, and the log says how the window is drawn, the WebKitGTK version, the session type and the NVIDIA driver's version. Drawing without the GPU leaves the fire on the Play button out (a plain button instead); Steam and other programs the launcher starts still draw with the GPU. - Update the Kiln runtime in your game too (the launcher shows the update next to Kiln on Play, or on the Runtime page). The runtime brings the ShroudForge, EML, XHL-Core and Skill Search fixes. The first start after the update runs ShroudForge's whole startup pass again (45 seconds on the test machine); later starts reuse it.
Known limits
- XHL-Core from its own copy is tested in Kiln's tests and in a Wine harness (a DLL loaded from
kiln\chain\no longer finds itself under the namedinput8.dll), not yet with XHL-Core's plugins in a game. Its log saysrole=chainedwhen it works. A start from Steam before the launcher placed the copy uses the old path once. - Kiln's creative menu and ShroudForge's World Editor both use F7 (World Editor: "Paste at cursor"), and Auto Loot Plus's settings and World Editor's "Capture and save blueprint" both use F8: one press does both. Change World Editor's shortcuts in its settings (ShroudForge's menu > World Editor > Keyboard shortcuts).
- Creative mode's glider steering and ShroudForge Unlimited Flight's "Upward Gliding" both steer the glider's nose with W and S. With both on, the nose can keep turning after you let go (Unlimited Flight changes the glider's turn rate a moment late). Use one of them.
- Servers: unzipping Kiln's server pack into a server that already has XHL-Core (its
dinput8.dll) replaces XHL-Core, and the server half of XHL mods stops working. Put XHL-Core back askiln/chain/xhl-core.dllin the server folder and add the linechain\xhl-core.dllunder[chain]inkiln/chain.ini. - The black-window fallback was tested on a virtual X display, not on an NVIDIA machine with X11: whether drawing without the GPU fixes that player's window is not known yet. If the window is still black with
--software-render, start it from a terminal and send thelauncher.logit names. - Everything in 0.2.0-dev.24's known limits still applies.
Kiln 0.2.0-dev.24
Kiln 0.2.0-dev.24
Most of this release comes from players' reports on Nexus and GitHub: a launcher that shows all of your mods in one list, mods of other loaders that really run, and nothing of yours deleted along the way.
The launcher
- One list of all your mods. The main screen lists every mod you added, for whatever loader, and the mods you put into the game folder by hand. Each has an on/off switch where Kiln can switch it. "Mods" now means all of them: the count covers every kind, and the line "N of M mods load on this client" is gone. A row's menu (the three dots, or a right click) has the mod's settings, its versions, its folder and Remove. "Load order" shows every mod in the order a start brings them up.
- No profile to set up. Kiln keeps your mods in one profile, "My mods", by itself. Profiles are in Settings, for people who want several sets of mods: save the current set under a name, load another. The Library's storage (size on disk, clean up) is there too.
- Removing a mod is one click. Typing the mod's name is off unless you turn it on in Settings ("Type a mod's name to remove it"). Uninstalling Kiln, deleting a profile or a server and restoring a backup still ask for the word.
- Play works when Steam is closed (Linux AppImage). The launcher started Steam with settings meant only for the AppImage. Every game start from that Steam then ended within seconds, with no window and nothing in Kiln's logs, until Steam was restarted.
- Adding mods on a Steam Deck works again. With ShroudForge installed under Proton, the launcher read ShroudForge's mods folder as
//?/S:/steamapps/common/Enshrouded/modsand every mod added failed with "Read-only file system". ShroudForge stores that folder as a Windows path on a drive of the Proton prefix (S:on a Deck); the launcher now finds it through the game folder. - Nothing you changed is deleted. Files a mod wrote into its folder in the game (settings, logs, saved values) are carried to the new version at an update and kept in
kiln/kept-mod-fileswhen the mod is switched off or Kiln is uninstalled. A folder you changed yourself stays where it is; the launcher says so, and whether that mod may still run. - An update of a mod that comes as a DLL (dinput8.dll and the like) replaces the old version instead of becoming a second entry, and the same DLL is no longer loaded twice.
- A game without a window still counts as running. If the game's window thread ends while the rest of the process goes on (it still hosts and saves the world), the launcher took the game for stopped and wrote into the folder of a running game. Stop it in Steam before you start it again.
- Enshwick packs import. A data pack written like Enshwick's own examples (
authors = ["You"],exports = [...],[[setting]],[[point]]inpack.toml) was refused as "its pack.toml is invalid". - shroudlink mods have one name. A single mod's zip was imported as
chestsort.dll, the same mod from the bundle aschestsort. Both arechestsortnow; an entry made by an earlier version keeps its name and still works. The shroudlink card says where its mods run: in your own game when you play alone or host, and on a dedicated server.
Mods of other loaders
- ShroudForge mods inside the game. Kiln's Mods menu has a page for each ShroudForge mod with its switch, its settings and its buttons.
- Shortcuts of ShroudForge mods work with the ShroudForge that Kiln brings along; you no longer need ShroudForge installed for them. This is what broke steering with W and S on the glider with ShroudForge's Unlimited Flight.
- Kiln's "Mods" entry is back in the main menu when ShroudForge mods are on. ShroudForge wraps the game's menu entries, and Kiln's own were lost behind it.
- EML mods run when a ShroudForge mod is in your mods too. ShroudForge then patches the game's data, and it runs an EML mod only when its own switch for that mod is on. Kiln's copies had no such switch: nobody applied them, and Kiln said they ran. Kiln now sets the switch, also on Linux when EML's own
dbghelp.dllis still in the game folder. For a mod ShroudForge does not run, the launcher and the in-game menu say why (switched off, made for the other side, or a file ShroudForge refuses) and suggest a switch only where a switch helps. - Going back to ShroudForge alone no longer needs a reinstall. Kiln's EML part put the game's data files back from a backup although ShroudForge had patched them.
- EML data mods: game files Kiln cannot prove it wrote are never overwritten or deleted. Leftovers of older versions are moved to
kiln/eml/displacedin the game folder, and the launcher names them. - Values you set in ShroudForge for an EML mod are kept when the mod is switched off, removed or Kiln is uninstalled.
- Flame mods (Creative Mode) run from the game's
modsfolder, where they read their own files. When Creative Mode has no data for the current game build, Kiln's own/creativestays available and says why. - Greeneye mods (The Worst Map Mod and others) run from their own folder in the game, where they keep their settings.
- XHL mods: their companion folders and settings go where they belong, and XHL-Core keeps the files it came with.
- SET (Shrouded Engine Tweaks) 0.2 mods: rules, saved settings and the tools windows. Under Proton the check for a second SET runtime could fail and leave SET's tools out.
- shroudlink: its client addon always loads before Kiln hooks the game. That was one reason for the missing MODS tab.
- The in-game Mods page is no longer empty next to ReShade or another overlay. When another program hooks the game's graphics functions right after Kiln, Kiln could miss the game's graphics device and draw nothing. It now takes the device over when the game makes its swapchain, if the PC has one graphics device; when it cannot, kiln.log says why.
- A ShroudForge mod that does all its work at startup shows "applied" instead of "Waiting".
Creative mode
- A steered glider. In creative mode S raises the glider's nose (up to 85 degrees) and W lowers it, and the glide boost pushes along the nose. An analog stick steers in proportion. A player whose Kiln is older, or whose controls use the game's other pitch mode, glides as before.
- Server owners: the rule is
glideSteerinrules/creative.json(the file's header says how to switch it off);"allowGlideSteer": falseinrules.jsonswitches it off for every player./creativetells a player when their game cannot steer.
Mod authors
- A PNG icon named in a blocks data file is found in the mod's own folder; an icon that cannot be used keeps the block with its base icon.
kiln.rules: the per-player ruleGlideSteer(KilnRulesPlayer.glide_steer_limit, statusglide_steered).kiln.ui5:subscribe_window_input.kiln.flame1.1.0:symbols().KilnBootInfo3.
Checked, not changed
- Enshwick 1.0.0-alpha.14 (bundled since dev.23) starts under Kiln's host tests with its real loader. Its new rule is read from the source only: Enshwick no longer hooks a function another program hooked first. On the client Kiln is first, so a feature of Enshwick that needs such a function may be off, and its log then names a Kiln DLL. This was not measured in a game.
Known limits
- Seen in a real game (Linux, Proton, one client): Kiln's entries in the main menu with ShroudForge mods on, W and S steering with ShroudForge's Unlimited Flight, and SET's tools. Everything else here was tested on Linux hosts, under Wine without a display and on dedicated test servers. Nothing ran on native Windows or on a Steam Deck; the Deck fixes follow one player's support report.
- The launcher's new main screen was tested in a browser against a stand-in for the launcher's backend, not in the installed app.
- On Linux, Steam can show the game as running for about a minute after you quit. Steam's own networking library crashes while the game shuts down, and the system then writes a crash dump of several gigabytes. No Kiln or mod code is on either side of that crash; whether it also happens without Kiln is not known yet.
- shroudlink's MODS tab has not been seen in a real game with this build.
- When one EML mod fails inside ShroudForge, ShroudForge drops its whole startup pass and none of its data mods apply that start. The in-game Mods menu shows them as failed; the launcher's engine view can still say they run.
- The steered glider with an analog stick, with the game's other pitch mode, and another player's steered glider seen from a second game are not checked in a game.
- The graphics device takeover needs a second program hooking Vulkan next to Kiln, which no test here has. With more than one graphics device Kiln still cannot draw in that case; kiln.log says so.
- ShroudForge 1.8.0 is not released yet. Kiln brings 1.7.9 and will support 1.8.0 when it is out.
Kiln 0.2.0-dev.23
Kiln 0.2.0-dev.23
Launcher fixes for dedicated servers, a Shroudlink client compatibility fix, and an Enshwick update.
Players and server owners
-
The Servers page no longer fails after a start. On a server that also runs the Emberwatch Lua mod (a ShroudForge mod, which Kiln's ShroudForge support now starts), the page showed "This page failed: (n.state?.players??[]).filter is not a function". That mod writes an empty player list as
{}, and the launcher had taken its file bridge because Kiln.Admin was not up yet. The launcher now reads such a state, and moves to Kiln.Admin's own connection as soon as that answers. -
Two admin mods in one folder are reported. Kiln.Admin and the Emberwatch Lua mod answer the same folder (
shroudforge/exports/emberwatch). With both installed, each request is answered by whichever reads it first. Kiln.Admin now writes a warning to kiln.log when it finds the other one's state file. Removemods/emberwatch-admin(Kiln.Admin does its work), or give Kiln.Admin a folder of its own with"bridge"inkiln/data/kiln-admin/config.json. -
No more rewrite loop after an update. After the restart into dev.22, the old launcher could stay alive in the background for a while. The two versions then wrote the game's
kiln/profile.jsonin turns, about twice a second, until the game was started. A launcher that is closing or restarting now stops its background work at once and ends for sure within five seconds, and a running launcher answers a foreign change ofprofile.jsonat most three times a minute. -
Shroudlink MODS tab compatibility. Kiln leaves Shroudlink’s client addon above Kiln in the game’s window-procedure chain when it attaches. Reattaching above the addon could make both handlers call each other until the game lost its window. Import and enable the Shroudlink client addon for the menu. Storage and Assistants also need their Shroudlink modules enabled on the server hosting the world.
-
Shroudlink singleplayer ZIP imports every module. Storage, Assistants, Chestsort, Meter, and Gemforge now appear as separate Library entries. Reimport the ZIP if an earlier import only showed one module. Enable the new entries you want and disable the old bundled entry if it is enabled.
-
Enshwick alpha.14. The bundled runtime now uses Enshwick 1.0.0-alpha.14.
Known limits
- The Shroudlink fix passed the window-procedure regression test. Storage and Assistants through the MODS tab still need confirmation in a real game client.
- Not run on native Windows or a Steam Deck.
- The update from dev.21 or dev.22 to this build still starts from the old launcher, so the old one can linger one more time; the new one no longer answers it without end.
Kiln 0.2.0-dev.22
Kiln 0.2.0-dev.22
This build is about mods that did not load. Players reported that mods made for other frameworks were refused by the Library, were invisible in the launcher, or sat in a profile and never ran. It also adds a mod manager inside the game, takes a 48 GiB read out of the first start, and makes the launcher lighter.
Players and server owners
- The Library takes mods the way they are shared. An EML mod with the id
HoardersHelperwas refused as "not a valid mod id"; such ids are the normal case. A mod for another framework now keeps its files as they are and gets a Library id made from its own id. ShroudForge packages with upper case in their id are accepted the same way. - 7z and rar. 7z archives are read directly. rar needs a tool already on your PC (unrar, 7-Zip, bsdtar or Windows' tar); without one the launcher says to extract first.
- Packages shaped like the game folder (a
modsfolder with a loader DLL next to it) import as their mods. A bundled loader Kiln does not need is one note, not an error. Adinput8.dllorwinmm.dllmod with its.iniand data files stays one mod with all its files. - Mods in the game folder are listed. The profile's Mods and Engines tabs show "In the game folder": every mod you extracted there, whether it loads with this profile, and why not. One button adds it to the profile, or switches that framework's drop-in folder on. Your files are never moved or deleted.
- Drop-in switches for every framework. Profile settings have a switch for EML, ShroudForge, Greeneye, Flame, Shroudtopia, Enshwick and shroudlink next to Kiln's four. Every framework follows its switch the same way now.
- A profile's mods load whichever loader runs. If EML's own
dbghelp.dll(or another framework's own loader) is in the game folder, that loader runs the mods and never looks into Kiln's Library, so profile mods of that framework did not run at all. While such a loader is installed, the launcher now copies the profile's mods into the folder it reads, and removes its copies again when the loader is gone. A mod never runs twice. When a mod cannot load for this reason, kiln.log has a warning and the launcher's engine row says so. - shroudlink's in-game MODS tab. The launcher took shroudlink's client addon (its
dinput8.dll) for a loader it does not need and left it out, so the tab never appeared. The addon is now added as a mod of its own; shroudlink's core is still not needed, because Kiln runs it. - SET mods load again with C# mods on. kiln-set mistook Kiln's own in-game mod list for SET's runtime and stood aside.
- Under Proton without a DLL override, a framework's loader file in the game folder does not run. Kiln used to step aside for it anyway; it now checks that the file really is the loaded code and runs the mods itself.
- The first start no longer reads all game data. With EML mods and no cache, kiln-eml read every game file (about 48 GiB on a full install) before the game started, with nothing on screen. Unchanged files are now recorded by their change stamp. A start that was closed half way continues. A small window shows progress when the step takes longer than two seconds, and the Play page shows the same.
- Mod manager in the game. MODS in the game's main menu opens a full page listing the mods of every framework, their state and reasons, with search and a filter for mods that need attention.
- Support report. Logs has "Save report": one zip with the logs, state files and a summary in plain sentences. Your user name, home folder, machine name, Steam ids, IP addresses and tokens are removed. Saves, worlds and mod contents are never read.
kilnctl reportdoes the same for a server. - Non-ASCII paths. With a Cyrillic, Chinese or accented Windows user name or game folder, kiln-quests crashed at boot, SET mods did not load and build regions were not saved. Fixed.
- Native Windows dedicated servers: new items and recipes register again (GitHub issue #14, "near memory: nothing free within 2 GB").
- Reinstall keeps your profile. After uninstalling and installing Kiln again, the profile you used is active again, and a dropped mod goes into it.
- A lighter launcher. Next to a running game the launcher's backend used about 50 ms of CPU per second; it now uses 1 to 8. The first status check after a start took 1.2 s and takes 0.05 s. While the window is not focused, it checks every 30 s.
- Steam Deck: the Downloads list shows
.7zand.rarfiles too.
Mod authors
- Mods of data only.
entryAssemblyinkiln.mod.jsonis optional: a folder with the manifest andcontent/*.jsonis a mod with nothing to run. It has its place in the load order and its packs apply. An emptyentryAssemblyis still refused, and a code project without one still fails the build (KILN001). - State words. A framework plugin that steps aside lists the profile's mods in its state file as
own-loader(the framework's own loader runs Kiln's copy) ornot-loaded(with a reason).schema/state-eml.schema.jsondescribeseml.json, includingphase: "running"with aprogressobject while the pre-start step runs. kiln.progress, a core service: a small native window with a line of text and a bar for work before the game's window exists. It never takes focus and does nothing on a server or withKILN_UI_DISABLE=1.kiln.uiv3 and v4: layout slots for full pages (font size, child flags, cursor and item queries, layers, keys), and the main-menu page (ui.menu_page).- Kiln's marker
.kiln-library.jsonin a framework's folder marks a copy the launcher placed for that framework's own loader. Drop-in scans skip a marked folder when the profile lists the same mod. - Launcher commands:
found_scan,found_add,report_save,report_summary,launch_prestart.profile_activateandprofile_activereturnownLoaders;engine_statusreturnsownLoader. kiln/state/library-placements.jsonis the only proof that a placed copy is Kiln's. A marker shipped inside an archive grants nothing.
Breaking and behaviour changes
- Drop-ins. With an active profile, a framework's own folder is read only when the profile's
dropinsistrueor a list naming that framework. Before, Greeneye, Flame, Shroudtopia, shroudlink and Ember read their folder whenever the profile had no mod of that framework, and Enshwick's loader ran for every hand-installed folder. Profiles made before this build keep loading what they loaded: the launcher writes those kinds into the list. Aprofile.jsonwritten by hand without them stops loading those folders. - kiln-shroudforge hosts ShroudForge for the packages in its mods folder when ShroudForge drop-ins are on, not only for a profile's ShroudForge mod.
- Play-once with another profile is refused for a framework whose own loader is installed when that profile's mods of the framework differ: the loader's folder is fixed for a start. The message says to activate the profile.
- While the launcher window is not focused, it refreshes every 30 s. Events from the game still refresh at once.
- Mods of other frameworks are listed in the Library under an id in lower case; the mod's own id is shown next to it.
eml.jsoncan sayphase: "running". Withphase: "aside"itsmodslist is no longer empty.
Client checklist
Only a real client, a Steam Deck or a Windows PC can confirm these.
- Windows with EML's
dbghelp.dllin the game folder: add an EML mod through the launcher, activate, start. The mod runs once.kiln/state/eml.jsonlists it asown-loader, andmods/<id>/holds Kiln's copy. Removedbghelp.dll, activate again: the copy is gone and the mod still runs once. - Steam Deck or Linux with ShroudForge's
dbghelp.dlland no DLL override: profile mods run (kiln.log says the folder's loader is not the loaded code). - The first start with EML mods on a real install takes seconds, not minutes. The progress window appears only when the step takes longer than two seconds, never takes focus, and is gone before the game's window.
- MODS in the main menu opens the mod manager; leaving returns to the menu.
- Drop a
.7z, a.rarand a game-folder-shaped zip on the launcher: the result line and its Details view read well. - A profile's "In the game folder" list matches what is in the folder; both buttons work.
- shroudlink in singleplayer: drop its singleplayer zip on the launcher, start, and the MODS tab opens and lists the mods.
- A Windows user name with non-ASCII letters: kiln-quests starts, a SET mod loads, a build region survives a restart.
- A native Windows dedicated server: a mod's new item registers (issue #14).
- Save a support report and read
summary.txt: nothing private is left in it. - Uninstall Kiln, install it again: the same profile is active and mods load.
Known limits
- Nothing in this build was run on Windows, on a Steam Deck or in a real client. It was tested with unit tests, Wine host tests with stand-in loader DLLs, and dedicated-server labs under Wine. One lab run used a real ShroudForge loader build.
- The copies for a framework's own loader are made when a profile is activated. If you install such a loader afterwards, activate the profile again.
- shroudlink's and Ember's own loaders cannot read Kiln's layout: with one of them running, a profile's mods of that framework do not load, and the state file says so.
- Enshwick's own loader may see a mod that was copied while it was already running only from the next start.
- The header check that tells Wine's builtin DLL from a framework's loader assumes the loader leaves its own image header in memory.
- exFAT and FAT game folders still read every game file at every start with EML mods; they now show progress.
- The byte counts for the EML start are measured on a synthetic 55-file data set, not on a real 48 GiB install.
- rar needs an external tool. A password-protected or split archive is refuse...
Kiln 0.2.0-dev.21
Kiln 0.2.0-dev.21
This build fixes the problems found in the dev.20 review, stops the launcher from removing mods while Enshrouded runs, makes EML mods start much faster, moves the hooks Kiln places on the game into one registry, and helps closed-source DLL mods (XHL, trainers) work next to Kiln.
Players and server owners
- The launcher no longer removes a Library version while Enshrouded runs. Remove and Clean up say "Close Enshrouded first: the game may be reading this mod". Clean up never lists a version the game's active profile uses. This is Kiln's side of GitHub issue #4 (PR #5, "Refs #4"): it closes a way to lose a mod folder mid-start, but the reporter's root cause is not proven.
- EML mods: a mod whose
src/mod.luacannot be read is switched off before the long game-data step, with the reason instate/eml.jsonand kiln.log. The other mods still run, and a file that vanishes during the run drops only its own mod. - EML starts read far less game data: each file at most once per start, and not at all while the OS shows it unchanged (bisdat/kiln-mods#17 found the cost; this follows their analysis). On a lab server under Wine with 7.5 GiB of real server data, a start that changed nothing went from 7.6 GiB read in 5.4 s to 562 B in 64 ms, and a start after a mod change from 30.2 GiB in 13.4 s to 141.5 MiB in 1.0 s. On synthetic 55 GiB data a cache hit went from 55 GiB read to 0 B. Not measured on a real client.
- The first start after this update still reads all game files once (about 48 GiB on a full client install, as in dev.20), because the old cache has no change stamps; later starts do not.
KILN_EML_FULL_HASH=1turns the reuse off. - Closed-source DLL mods (XHL-Core, Auto Loot Plus, trainers) can clash with Kiln over the same game function. The profile's native page now has a "Load after Kiln and ShroudForge" switch per chain entry, shows last session's hook overlaps with a one-click "Load late", and lists the compat rules that apply.
- Chat: Kiln's chat commands no longer depend on the game's return address, so kiln-emf's chat hook or an EMF mod's hook in front of Kiln's can't hide players' lines from them (a dev.20 bug). Tested with stand-in hooks under Wine; the real-client check is open.
- ShroudForge and SET placement and modpack installs no longer refuse a folder just because
/homeis a link to/var/home(Fedora Atomic, Bazzite). Links inside the managed folders are still refused. Tested with symlinks on Linux, not on a Fedora Atomic host. - Leftovers from dev.19 are cleaned up. A launcher build with Nexus off gives
nxm://links back to the handler you had before (Vortex, for example); a stray link is forwarded to it, or you get a message on how to reset the handler. A personal Nexus API key stored by dev.19 is removed, in every build, without being shown. - Smoother play: mod status lines never make the menu, tick or frame wait. EMF portraits are drawn off the boot thread, and current pictures skip the renderer. SET no longer re-reads a catalog without texts every 60 s, and handles non-ASCII Windows paths.
- File names that Windows would change (trailing dots or spaces) are refused in mod zips, runtime bundles and modpacks.
Mod authors
- kiln.hooks v2. One registry owns one detour per game function. Every handler is a link in an ordered chain. Order:
before/afterconstraints, then priority (higher first), then registration order. New C calls:raw_detour(any signature, floats too),detour2(up to 12 integer arguments),mid2,caller(),call_original2,map_json. Seedocs/kiln/services/hooks.md. - C++ header
native/core/abi/kiln_hook.hpp:kiln::RawHookandkiln::MidHook2. Useg.install(...)on a global. Readg.caller()before calling the original, instead of_ReturnAddress(). - Every Kiln service and the core tick now hook through the registry. Only system DLL exports (
LoadLibraryExW, Vulkan, XInput) and mod hooks outside the game exe still use plain safetyhook. kiln/state/hooks.jsonlists every hooked function, its links in order, and other modules' hooks found before or over Kiln. kiln.log sayshooks: <label> chained over <module>+0x...andhooks: <module> hooked over Kiln's <label>.- EMF mods'
hook,hook_patternandhook_address, and Shroudtopia'sCreateDetour, are links owned byemf:<id>andshroudtopia:<mod>. They run newest first, before Kiln's own links. - ShroudForge's six engine hooks go through kiln.hooks when Kiln hosts it, so another DLL's jump on one of them no longer switches its native runtime off. Dormant on the current game build (see Known limits); tested with a stand-in and a synthetic legacy profile.
KILN_SF_ENGINE_HOOKS=selfkeeps the old behaviour. chain.inigains[late]: entries named there are loaded by kiln-core after Kiln's services, plugins and ShroudForge.state/native.jsonreports them underchain.late.compat-rules.json(Kiln's, then yours in<configDir>) canwarn, load a chain DLLlate, ordisablea chain DLL or a profile-listed mod. The launcher applieslateanddisableof chain entries when it writes chain.ini; kiln-core logswarnrules, skips a disabled profile-listed mod and reports anything else as not applied. Schemas:schema/compat-rules.schema.json,schema/hooks-state.schema.json.- Managed hooks cost less (lab, Wine,
GetComponent): about 6 ns per call through an empty chain and 59 ns through a managed handler. dev.20 measured about 65 ns and 100 ns. - Item transfer handlers see
KILN_TRANSFER_DRY_RUNon a mod's dry-run move. Roll nothing forward there: don't count, log or change anything outside the transfer. component_changechecks an add's payload against the component's size from kiln.types and refuses a mismatch.Overridesfrom a background thread belong to the mod that got the handle. Without one they throwInvalidOperationException.Texts.Getreturnsnullwhile another thread is loading the catalog (Texts.Preload, or a first call), instead of waiting.Assets.Reflectreturnsnullon builds without kiln.types.- World program
TryRead/TryWriteno longer allocate or lock per entity. Without kiln.types they log once per program. - KILN111: items registered with
ItemDefinitioncount. A game-style name missing from your local catalog is now info, not a warning. - Launcher commands:
chain_view,chain_set_late,library_unused,library_users,library_remove_many.library_removetakesshown(the users its dialog named) and refuses when anything else uses the version. - Mid hooks keep safetyhook's stack rules:
trampoline_rspstarts atrsp - 8, and a handler at a function entry returns early by settingtrampoline_rsp = rsp. - Installing the same raw handler on a function again replaces the earlier link in one step. An install that matches a revoked link (same function, handler, owner and label) takes that link's slot again.
hooks.jsonlinkSlotsandKilnHooksStats.links_used/links_cap/targets_capshow the use; kiln.log warns at 75% and when full. KilnHookOrder.flagswithKILN_HOOK_NEWEST_FIRST: at one priority, flagged links run newest first. EMF and Shroudtopia detours use it, so the newest mod detour runs first across both engines.- A DLL loaded late (or a native mod) may patch the game's entry point: the proxy puts the entry's own bytes back before the core starts, and the patch runs before the game's own entry.
[late]limits: EMF's own loader is never deferred; a DLL another loader already started is reported asalready-loaded; a late DLL of a disabled or policy-refused native mod is skipped; an early or boot native mod cannot require a late one. Seedocs/kiln/engines.md.- Play-once:
chain/once.inicarries the play-once profile's[chain]and[late], so that start follows its own compat rules. - EMF
image_load("portrait:<key>")from a tick or render thread returns a handle at once while the picture is still being drawn. It shows nothing until the drawing finishes, then the picture.
Breaking and behaviour changes
- A v1
detour(and managedHooks.Detour) now passes every argument to the original, not only the first four. - Hook order between Kiln's own services follows the registry (priority, then registration). The core tick links stay innermost.
- EMF and Shroudtopia mod hooks now run before Kiln's own links on the same function.
- Library removal is refused while the game runs, even with force. A running server blocks it only when its profile points into the Library.
- Item transfer handlers are now also called on dry-run moves (not on silent ones), with the dry-run flag set.
- Managed: background-thread override claims without a mod throw.
Texts.Getcan returnnullwhile another thread loads the catalog. Status lines show the last snapshot and refresh a moment later. - npcai faction hooks and creatures rules keep their links after 64 on/off rounds, answering nothing.
- kiln-eml's
files.jsongains change stamps. Older Kiln reads it fine. Use kiln-emf and kiln-eml from the same release: portrait cache codes 5 (busy), 6 (full) and 7 (cache I/O error, tried again next start) are new. - A hook function installed twice on the same game function is one link now: the second install replaces the first.
- A compat
disablerule on a native mod whose DLL the proxy already loaded is reported as not applied (it used to say applied). Re-activate the profile in the launcher to apply it. - An older proxy ignores
[late]and loads those DLLs early. - Every launcher build deletes the personal Nexus API key dev.19 stored, on start. A build with Nexus off also gives back the
nxm://registration dev.19 made.
Client checklist
Only a real client or a joined player can confirm these.
- Hooks on the client: Kiln's menu opens and draws, the camera and render hooks work, the in-game UI hooks behave as in dev.20 (ui, render, game; input and Vulkan stay on saf...
Kiln 0.2.0-dev.20
Kiln 0.2.0-dev.20
This build fixes Windows profile activation and expands the mod API, building blocks, and compatibility with other Enshrouded mod frameworks.
Players and server owners
- Fix profile activation failing on Windows with
inspecting \\?\C:: Incorrect function. (os error 1). Normal and extended-length paths retain junction and traversal checks. - Update EMF compatibility to 0.6 / API 27, including the official hidden-chat networking protocol and portrait-generation bridge.
- Fix ShroudForge startup asset publication on Windows, including open archive handles, failed replacements, and unsafe recovery paths. The bundled fork includes the reviewed fixes and matching source.
- Fix portrait generation on Wine/Proton libraries stored on mounted volumes while retaining checks against symbolic links and junctions in cache paths.
- Improve frame/tick pacing and mod cleanup across unloads and world changes.
- Preserve saved mod attachments when their template metadata is temporarily unavailable, within the existing three-session retention limit.
Mod authors
- Add and extend loot, quest/dialogue, furniture, crafting-station, menu, screen-effect, and UI building blocks, with templates, schemas, lint checks, and examples.
- Add declarative ECS world programs with checked component access and owner cleanup.
- Improve inventory transfers and persistent default-loot handling, including save timing, stable identities, rename migration, and restart behavior.
- Add and extend server flame progression, localisation, resource reflection, and SET integration.
- Fix ownership and retirement races in gameplay components, overrides, offers, hooks, interactions, and status lines.
- Generate analyzer API catalogs from the project's actual compiled sources and reject incomplete or invalid catalogs. Refresh SDK and editor metadata.
Nexus
The entire Nexus integration is disabled in this build while Kiln's OAuth application registration is pending. Catalog, account, OAuth, download-handler, and related background operations are unavailable. There is no personal API-key fallback. Local mod imports remain available.
Compatibility limits
Private dedicated-server tests loaded Lua 1.19, Beastmaster 1.13, and representative ShroudForge content together across two boots. This does not establish compatibility between every pair of mods. The tester's exact second ShroudForge mod is still unknown.
Joined-client gameplay, taming, multiplayer behavior, UI/input, client-world behavior, and in-game custom portrait display still need client testing. Windows-specific automated checks run under Wine; physical Windows 11/game-launch confirmation remains pending.
The wiki and agent skill document the new APIs and these limits.
Kiln 0.2.0-dev.19
Kiln 0.2.0-dev.19
- Fixed: 0.2.0-dev.18 could drop the game to about 10 fps whenever a profile was active (playing without mods was normal). The Shrouded Engine Tweaks support checked every loaded game file on every frame. It now checks only when a new file loads.
- Fixed: updating Kiln skipped parts that are new or became default in the update. Since dev.18 that includes the support for EMF, EML and ShroudForge, and Enshwick. Updates now install them. Only parts you turned off yourself stay off, and that choice is kept across updates and rollbacks.
- If you updated to dev.18 and other frameworks' mods don't load, open the launcher's Runtime page: the Parts card shows what's missing and lets you add it.
- Low frame rate in a world while another game runs at the same time (for example World of Warcraft) is usually video memory: start Enshrouded first, or close the other game before you start it.
Kiln 0.2.0-dev.18
Kiln 0.2.0-dev.18
- Mods for other frameworks now run on Kiln, unchanged. Kiln loads them through its own compatibility plugins, so you don't need the other loader installed:
- EML (Enshrouded Mod Loader) mods, including ShroudForge mods. ShroudForge comes with Kiln; if you already have your own ShroudForge, a setting uses yours instead.
- EMF mods made for EMF 0.3.3 up to 0.5.1. EMF support is now installed by default.
- Shrouded Engine Tweaks (SET) Lua mods, in worlds you host.
- Enshwick mods (DLL, Luau and data packs). Kiln ships Enshwick's own loader; a copy you installed yourself still takes priority.
- Greeneye Loader mods, Shroudtopia mods, the Creative Mode mod (Flame), and shroudlink server mods.
- Ember server mods are found and listed, but don't run until Ember publishes its loader.
If the other loader is installed too, Kiln steps aside or chains it. Installing Kiln never switches another loader off.
- The launcher manages mods for every framework like Kiln mods: drop them in or import them in the Library, turn them on and off per profile, sync them to servers, and put them in modpacks.
- Creative mode, now with everything from the "Creative Mode" mod: a creative menu with items, the day and night cycle, no fall damage, free crafting and storage upgrades, kept ammo, food and potions, gear upgrades and gem slots, map reveal, a backpack grid, and character flight (off by default). When the original Creative Mode mod is installed, Kiln's creative mode steps aside for it.
- The creative glider: hold S to pitch up and W to dive. The mouse stays free to look around.
- Dedicated servers: a new server pack (
kiln-server-0.2.0-dev.18.zip, an optional file on Nexus) that you unzip into the server folder, also on rented hosts with only FTP. There's a new guide too: https://frostdev.io/kiln/wiki/dedicated-servers. The systemd units for Linux servers now come with each release. - Kiln finds game functions even when another framework has hooked them first, and boots about twice as fast. Removing one of Kiln's hooks never removes another framework's hook on top of it.
- More robust: faults in Kiln's own code are caught, and that part of Kiln is switched off until the next start instead of retrying.
- Fixes from full code reviews of everything above: safe mod imports (size limits, no links), mod ownership that a file inside a mod can't fake, crash-safe EML data patching, and more.
- Not tried in the game yet: most of the frameworks above were tested in labs and on a test server, not with every real mod. Please report anything that doesn't load: the launcher's Logs page shows why.
Kiln 0.2.0-dev.17
Kiln 0.2.0-dev.17
- Steam Deck: the game no longer hangs on a white window when it starts with Kiln. Kiln's in-game overlay attached itself to the graphics a second time over its own hooks and the game never got its window. If you set
KILN_UI_DISABLE=1in the launch options as a workaround, you can take it out again. - Kiln's overlay now attaches to the graphics more carefully on every system: each function is checked on its own, it never hooks over its own hooks or another program's (an overlay, for example), and the log says what it found.