Repository navigation
Grass Mod Guide
Grass is the one record type AutoSeasons treats differently from everything else, because Skyrim
itself treats grass differently: it's never a placed object with its own reference. Every blade of
grass on a patch of terrain is drawn from whichever LandscapeTexture (LTEX) currently wins on
that patch, specifically from that LTEX's own Grasses list of Grass (GRAS) records. There's no
"seasonal grass swap" independent of that - only "which LTEX wins, and what's in its Grasses list."
This page is for anyone authoring a grass mod who wants their grass to change with the seasons under AutoSeasons, with as little Creation Kit work as possible.
Pick whichever fits how much control you want - both are fully supported and AutoSeasons checks for the mod-authored one (Option B) first before ever falling back to generating its own (Option A).
Drop a season-suffixed sibling of your grass .nif in the same folder as the original:
meshes\landscape\grass\mygrass01.nif
meshes\landscape\grass\mygrass01_win.nif <- winter variant
AutoSeasons finds it automatically, duplicates your base Grass record for you, and points the
duplicate at the seasonal mesh. You never touch xEdit or the Creation Kit for this - the exact same
mechanism used for a Static's seasonal texture, just for grass meshes instead.
If you want to control density, height range, or other Grass record settings per season yourself,
create your own Grass record in xEdit/CK with an EditorID following <BaseEditorID>_<suffix>,
e.g. a base grass MyGrass01 gets a winter record MyGrass01_WIN. AutoSeasons detects it and
reuses it exactly as authored, instead of generating its own duplicate on top of it.
Grass uses a slightly wider suffix set than every other record type, because several existing grass packs already use short two-letter forms (most notably Cathedral 3D Grass Library's own convention) - both the mesh filename suffix (Option A) and the EditorID suffix (Option B) accept the exact same list:
| Season | Suffixes |
|---|---|
| Winter |
win, winter, sn
|
| Spring |
spr, spring, sp
|
| Summer |
sum, summer, su
|
| Autumn |
aut, autumn, fall, au
|
You don't need to provide every season - a grass type with only a winter variant only ever gets a winter duplicate/reuse; the other three seasons keep showing the base appearance.
This is the part that trips people up, because it has nothing to do with AutoSeasons: your base
grass has to already be in a LandscapeTexture's Grasses list for it to render in-game at all,
seasonal or not. AutoSeasons doesn't invent new terrain-grass assignments - it only swaps which
grass a season's LTEX duplicate points to, among grass already assigned to that LTEX by you or
another mod. If your grass isn't in a LandscapeTexture's Grasses list anywhere in the load
order, no amount of seasonal-naming-convention correctness will make it appear.
Once it is assigned, AutoSeasons carries the whole Grasses list over to every seasonal duplicate
it generates for that LTEX, substituting in whichever entries have a seasonal variant (Option A or
B above) and leaving the rest as-is (or dropping them in winter - see below).
If a different mod's own Data/Seasons ini already declares a swap for the exact LandscapeTexture
your grass is assigned to, AutoSeasons normally defers to it entirely (see
Season Mod Conflicts). There's one specific exception that matters for
grass mod authors: if that other mod's swap keeps the same diffuse texture and only changes the
grass, AutoSeasons still generates its own texture duplicate as usual but reuses that mod's grass
list verbatim - so your grass still gets picked up as long as it's in whichever Grasses list ends
up winning, without you needing to do anything about the texture conflict yourself.
If a grass type has no detected winter variant (neither Option A nor B) and the end user has Remove grass in winter enabled (the default), AutoSeasons drops that grass type from the winter LTEX duplicate entirely rather than leaving it showing its green, out-of-place base appearance under snow. This is decided per grass type, not per LTEX - a landscape texture with five grass types where only one has a winter variant keeps that one and drops the other four. If you'd rather your grass simply stay visible year-round when you haven't authored a winter variant, that's already the default behavior when a user turns that setting off - nothing you need to do on your end either way, just worth knowing so you're not surprised by grass "disappearing" in winter that you never made a winter version of on purpose.
Run AutoSeasons with Preview only (dry run) (or --dry-run -v on the CLI) and check the log for:
-
Generated N seasonal grass duplicate(s) from detected seasonal grass meshes- confirms Option A meshes were found and would get duplicated. -
Reused N mod-provided seasonal grass record(s) already present in the load order (e.g. "Base_WIN")- confirms your own Option B records were found and reused.
If your grass type doesn't show up in either count, double check: the mesh/EditorID suffix matches
the table above exactly, the file sits in the same folder as the base mesh (Option A), and the
base grass is genuinely referenced in a LandscapeTexture's Grasses list somewhere in the load
order.
If you're declaring your own seasonal coverage instead of relying on AutoSeasons' naming-convention
detection, save the ini file as plain UTF-8 without a byte-order mark (BOM). A leading BOM
shifts the first line's [SectionName] header by three bytes, which can make AutoSeasons fail to
recognize the section at all and silently treat the whole file as empty - most text editors have an
"encoding" option where you can pick "UTF-8" instead of "UTF-8 with BOM"/"UTF-8-BOM" explicitly.