Skyrim Special Edition

File information

Last updated

Original upload

Created by

IDontEvenKnow

Uploaded by

IDontEvenKnow

Virus scan

Safe to use

About this mod

Chasing butterflies, diving into rivers, sifting through foliage, poring over every inch of cave wall...mindless tedium I was sick of many playthroughs ago. Why not brush off your spellbooks and let a little Alteration magic do the work for you?

Requirements
Permissions and credits
Translations
  • Spanish
Mirrors
Changelogs
Donations
Chasing butterflies, diving into rivers, sifting through foliage, poring over every stump and inch of cave wall to find the fungus among us...there are things I look forward to when beginning a new playthrough, but meticulously grinding for alchemy ingredients is definitely not one of them.

I had a look over existing solutions to this problem, and I find none of them to be satisfying on either a functional, or technical level.
To remedy this, I present my solution: IHarvest.

-- Usage --
This mod adds a single spell, "Harvest".

To use the spell, just cast it. Note that, as a concentration spell, it will continue to operate as long as you cast it. It will scan your surroundings, learn what in the area can be harvested, and finally send out little, magical Getter Critters to fetch stuff for you.

To get the spell, you'll have to find a spellbook. I hand-placed about 20 of these around Skyrim and Solstheim—check areas where alchemists live (more specifically, lived, especially those who met an unfortunate end), in witch or hagraven dwellings, etc. If you have trouble finding a copy, some hints are down below under --- Locations ---.

Somewhat harder to find, also available is a Staff of Harvest. I especially recommend its use for less magically-oriented characters, but don't disregard it even if you can afford to cast the spell, as it operates slightly differently, and is useful in its own right.

You don't really need to know anything else, or to read the rest of the description unless you want to—the mod is designed to "just work™".



Still reading? The rest is pretty tl;dr, but more power to you.

The spell's range and "refire" speed will improve as your Alchemy and Alteration skills level up, and dual casting the spell further increases range and refire rate substantially. Casting the spell separately in each hand doesn't seem to work on account of some engine limitation or other.

The mod will automatically harvest any TREE and FLOR records that produce ingredients, as well loose ingredient items, and most scripted activators that produce ingredients.

The mod will never steal, which means that it will ignore any object marked as "owned", even if taking those ingredients would not count as stealing on account of interpersonal relationships. It will not search containers, as that is not in the spirit of the mod.

As of v1.1.0, the magicka cost of the spell is still pretty cheap, but is considerably higher than before. Use of the Staff of Harvest is recommended for less magically-oriented characters, however you may also choose to retune the magicka cost to your liking using the MCM menu.

You can adjust how much Alteration experience the spell awards in the mod's MCM menu. The default value is worth quite a lot of exp at lower Alteration levels, though it tapers off considerably by level 50 or so, and takes several tens of thousands of casts to max out Alteration by use of this spell alone.

-- Locations --
Though the intention is to randomly stumble across the mod's items while naturally playing the game, here are some hints if you need a little help.
  • One might try checking the library belonging to a group of rogue mages known for bibliotheft
  • The home (tomb?) of a particular nirnroot-obsessed Altmer would be a good place to look
  • A certain witch haunting the outskirts of Riverwood has been rumored to be harboring a copy
  • A friendly hagraven was known to have kept a copy, before being thrown in a cage by her sister
  • One wonders why the owner of an ancient, self-filling potion flask would need to amass large quantities of ingredients, and yet...
  • An eccentric staff enthusiast might take interest in a means to expedite the gathering of fungal nutrients
  • Those 'ugly fungus-looking things' would be a lot harder to reach without a certain someone's staff on account of that damn barrier...at least she won't be running out of souls any time soon
Here are the exact cell locations of everything:
Spoiler:  
Show
Spell tomes:
Interiors:
AnisesCabin01 "Cellar" [CELL:000DDF7C]
BlindCliffCave01 "Blind Cliff Bastion" [CELL:000152B7]
HobsFallCave01 "Hob's Fall Cave" [CELL:0001525F]
ForsakenCave02 "Forsaken Crypt" [CELL:0002FD85]
FellglowKeep02 "Fellglow Keep" [CELL:0003FF10]
BlackreachZCell10 "Sinderion's Field Laboratory" [CELL:000EEC55]
CragwallowSlope01 "Cragwallow Slope" [CELL:000152A8]

Exteriors:
POINorthernCoast18 [CELL:00008DEA] (in Tamriel "Skyrim" [WRLD:0000003C] at 24,31)
AlchemistsShackExterior [CELL:0000983C] (in Tamriel "Skyrim" [WRLD:0000003C] at 17,-21)
KarthspireCamp [CELL:00009580] (in Tamriel "Skyrim" [WRLD:0000003C] at -31,2)
ClearpinePondExterior02 [CELL:000092C7] (in Tamriel "Skyrim" [WRLD:0000003C] at -27,23)
RoadsideRuinsExterior [CELL:00009C41] (in Tamriel "Skyrim" [WRLD:0000003C] at -11,-20)
POIPineForest06 [CELL:00009BBF] (in Tamriel "Skyrim" [WRLD:0000003C] at -13,-16)
POIPineForest33 [CELL:00009C59] (in Tamriel "Skyrim" [WRLD:0000003C] at -2,-21)

[CELL:0009829D] (in DeepwoodRedoubtWorld "Deepwood Vale" [WRLD:00029AB7] at -31,18)

[CELL:0200EF78] (in DLC2SolstheimWorld "Solstheim" [WRLD:02000800] at 10,3)
[CELL:0200EDC8] (in DLC2SolstheimWorld "Solstheim" [WRLD:02000800] at 13,16)
DLC2POINorth04DB [CELL:0200ECBA] (in DLC2SolstheimWorld "Solstheim" [WRLD:02000800] at 19,24)
Staves:
Interiors:
BlackreachZCell10 "Sinderion's Field Laboratory" [CELL:000EEC55]
DLC2TelMithryn "Tel Mithryn" [CELL:03017787]
ForsakenCave02 "Forsaken Crypt" [CELL:0002FD85]

Exteriors:
DLC01SoulCairnBoneyardEntrance [CELL:020028BF] (in DLC01SoulCairn "Soul Cairn" [WRLD:02001408] at 1,2)

-- How it works --
There are a couple other mods that do similar things on the nexus, so you might wonder "why is this better?" Well, here's a big technical information dump if you're curious:
Spoiler:  
Show
I'll describe the way similar mods generally work first: the mod contains a manually curated FormList of things to look for. When looking for something to harvest, FindRandomReferenceOfAnyTypeInListFromRef is called, passing in the "target" FormList. This mostly works, but there are a couple of major drawbacks:
  • The list needs to be manually patched any time a mod does something like adding a new ingredient, or modifying existing flora, because it's stored in the plugin file. It's also really tedious to create these lists for the author, and it's not unlikely that the list has missing or incorrect entries because of this.
     
  • The Papyrus function works okay the first time you want to get something, but here's the problem: when you harvest something, the reference doesn't go away.
    • Imagine you had a deck of cards, and you want to look at each of them exactly once. You grab a random card, look at it, put it back in the deck and shuffle it. The first time you grab a card, there's a 52/52 chance that it's something you want to look at, which is fine. The next time it's 51/52, then 50/52..26/52...2/52, 1/52. By the time you're half way though the deck, there's only a 50% chance that the next card you grab will be something you want to look at. When you're down to the last card, it's only 1/52!
    • Now, imagine the size of the deck is completely unknown—you have no way of knowing if you even have looked at every card! Translate this into Papyrus, and it means you waste a lot of time sorting through things you've already harvested, which is far from ideal.

My mod uses much more advanced systems to solve these problems:
  • With the exception of a few scripted activators, no harvestable objects are hard-coded in, not even vanilla ones. The mod uses a system that automatically analyzes potential harvestables, and builds the "target" FormList up at run-time, starting with an empty list. This allows this mod to work with any mod that adds new ingredients, or makes changes to vanilla harvestables, without a patch. It would probably even work on a total conversion.
     
  • When finding flora, we leverage the Story Manager to find references in the nearby area, instead of using a Papyrus function. This is harder to implement, but much more powerful, because we can use the engine's native condition functions to filter out which references we get back long before we ever have to (very slowly) process them with Papyrus.
    • Using the same deck analogy from earlier, imagine it works the same, except that every time we draw a card and look at it, we can mark the card before we put it back, and we can check if the card is marked before drawing it. We still don't know how big the deck is, but this allows us to avoid drawing the same card more than once. This is much, much more efficient, and we also know when it's okay to stop searching because we'll know when every card is marked (or rather when the Story Manager stops finding anything).

While the mod learns what things it can harvest, it will check TREE, FLOR and scripted ACTI (Critter, FXfakeCritterScript, and NirnrootACTIVATORScript) records to see whether those objects produce ingredients. All base objects scanned are inserted into the IH_ExaminedTypes leveled list and will never be scanned again (as that would be wasteful); objects that are found to produce ingredients are also inserted into IH_LearnedTypes. Most things produce an ingredient directly, but it is also possible for harvestables to produce LeveledItems and/or FormLists instead. In these cases, the mod will fully recurse through the LVLI/FLSTs, and if there is any chance for these to produce any ingredients at all, they will be learned.


Technical aspects aside, this mod also has Getter Critters, and I think it's really cool to look at 'em go.

-- SkyPal, Story Manager, and Start modes --
v1.2.0+ makes use of a new library originally custom-built to improve IHarvest, named SkyPal, by doticu (aka r-neal-kelly).
There is also an updated version available here, SkyPal NG, by Dylbill.

SkyPal adds some new Papyrus functionality that IHarvest can use to greatly improve both script speed and reliability. Additionally, a new feature to v1.2.1 selectively modifies Getter Critter collision so they won't knock around the player or NPCs, or mess up physics objects, as I originally envisioned for the mod but wasn't able to accomplish for technical reasons.

Note that SkyPal is not required, and if not available, the mod will fall back to Story Manager mode by default. This usually works fine, but in my experience is slightly more crash prone, and on account of some game engine quirk, has a tendency to randomly stop working for short periods, up to a few minutes at a time.

The other mode available is Start, which (again, in my experience) doesn't randomly break as often as SM mode, but is slightly more likely to crash the game, especially with other scripted mods installed.

-- Troubleshooting --
If the mod fails to load—there's no spellbook in the obvious locations like the Alchemist's Shack, or Anise's Cabin's basement:
  • Double check your load order. NMM in particular has trouble with .esl files, and you have to make sure the plugin is actually activated.
  • If you're having trouble with the .esl version for some reason, you can also try installing the mod for Skyrim VR in the FOMOD installer, which is exactly the same as the standard version, except with the plugin extension changed to .esp.
If the mod was working for a while, but suddenly stops:
  • First, just try going somewhere else and cast again there. On occasion, the engine just stops finding stuff properly, and I have no idea why. If you then return to the original area, the spell will often spontaneously start working again.
  • If it still isn't working, try opening the MCM menu and run Recall Active Critters, and Clear Flora Cache. Wait ~10 seconds for those to run, and briefly cast the spell to start the "learner" routine, which will take about a minute to rescan the nearby area. Then, try casting the spell again.
  • If the spell still doesn't work, reopen the MCM menu, and run Delete Getter Critters. By this point, the mod will usually start working again.
If you're still having trouble, or your issue isn't listed here, leave a comment/bug report, or send me a PM and I'll see if I can help.

-- Compatibility --
You probably don't need to know any of this, but I've documented it here anyway in case you'd like to know.

This should work out of the box with any mod that adds new harvestable ingredients, no patches required. The main exception to this are harvestables implemented as scripted activators (such as Nirnroots), instead of normal tree or flora records. These require a bit of extra scripting to handle, so please leave a comment or bug report if you find an unsupported mod and I'll see about fixing it.

Skyrim VR is semi-supported, however I have not been able to test properly myself for lack of the appropriate hardware.

The mod is an .esl, as the .esl format best fits the mod

You shouldn't have to worry about load order, anywhere high in your load order (where .esls naturally load anyway) should be fine.

Technically speaking, this spell is not player-centric; or, in other words, if you had some way to get an NPC to cast the spell, it will probably work for them just fine. I'm not really sure how one would go about doing this, but if you want to experiment, then please, be my guest.

I don't have any plans to backport the mod to LE/Oldrim/Classic, sorry:
Spoiler:  
Show
A proper backport requires recreating the plugin from scratch in the old CK, as well as possibly having to recreate textures and models, which I simply don't have the patience to do + proper testing + maintenance of two different versions. I created the mod for the version of the game I was playing at the time, and never realized how difficult backporting would be until the mod was nearly finished.

I'm not against the idea of a backport, though, so if anyone else wants to try to take on the task, they're free to do so. The mod is WTFPL licensed.

 
-- Vanilla Fixes --
All recommended fixes are included by default in the FOMOD installer as of v1.1.5, but the old notes are listed below:
Spoiler:  
Show
This fixes issues with certain vanilla harvestables, which prevent actors other than the player from being able to interact with them as expected. This doesn't fix anything game-breaking, but without this module, IHarvest won't be able to interact, or will interact a little weirdly, with a few specific things.

Most of these fixes have been merged into USSEP 4.2.0 (here and here); however, as some mods (e.g. Flora Respawn Fix) override some of these same scripts, and my own fixes are not included in the script versions included in those mods, you may still wish to install this module separately.

For non-USSEP installs, load the .esp low in your load order, and install priority should also be late.
For USSEP installs, the same applies, but you may uncheck the .esp, as the fixes included in the plugin were merged into USSEP 4.2.0.

This module is entirely optional, and here is what it fixes:
  • fxFakeCritterScript (jumping salmon, maybe some others): Has a bug where loot items are added directly to the player's inventory on activation, instead of to the object that activated it. In addition, there are a number of other bugs with this script (save bloat and script load related) which are fixed by USSEP, and these changes have also been carried over.
     
  • FCaddIngrediantAndDeleteSCRIPT (dead salmon from e.g. being shouted to death, maybe some others): This script has an unnecessary check for the player, which I have removed.
     
  • Hearthfire planters were implemented in a very stupid way by Bethesda, and because of this, they do not work with my spell. See here and here for details. I have tweaked these to work the way they should have worked from the beginning, which allows my critters to interact with them properly, and also fixes the bug where they do not work with the Green Thumb perk.

-- Known Issues --
Try as I might, there are a few annoyances that I have not been able to fix. None of them are major, but here's the list:
  • Getter Critters have collision like any other actor, and occasionally will push the player or other objects around as they do their business.
    The best known workaround is to install I'm Walkin' Here, which will (mostly) prevent critters from colliding with the player.
  • The critters probably won't work right, if at all, in modded areas lacking a navmesh.
  • Getter critters have a tendency to wander into areas that most other actors would have no reason to do so, and in doing so have a good chance to discover bad navmeshes, which may cause your game to crash. If you find that casting the spell in a particular area consistently crashes, you may want to try again with all other mods deactivated, and try enabling a few mods at a time until you find where the trouble is. To fix this would require renavmeshing the area by hand, which is a pain.
  • Papyrus logs are noisy, and this mod sometimes contributes to that noise. All of the errors listed below are harmless. Note that your line numbers will most likely be different than the ones below because of script version differences:
Spoiler:  
Show
[07/28/2019 - 09:55:52PM] Error: Unable to call RegisterForSingleUpdate - no native object bound to the script object, or object is of incorrect type
stack:
[None].IH_HarvestSpellScript.RegisterForSingleUpdate() - "<native>" Line ?
[None].IH_HarvestSpellScript.OnUpdate() - "IH_HarvestSpellScript.psc" Line 119

When you stop casting the spell, this occasionally comes up in the log. This happens because the game engine deletes the spell's ActiveMagicEffect object, as well as any attached script objects, the moment that casting stops, but does not clean up the active threads belonging to those script objects. If those unbound threads try to call any function on themselves, such as self.RegisterForSingleUpdate(), at this point self=None, because the old "self" object no longer exists, and because function calls can never be called on a None, the function call instead does nothing and logs an error. Curiously, this is perfectly normal, just a quirk of the game engine.

[08/14/2019 - 06:23:36PM] Error: Cannot divide by zero
stack:
[ (FF001380)].ih_gettercritterscript.GetClosestPointAtRadius() - "IH_GetterCritterScript.psc" Line 427
[ (FF001380)].ih_gettercritterscript.TranslateWithinRadiusCoords() - "IH_GetterCritterScript.psc" Line 415
[ (FF001380)].ih_gettercritterscript.OnUpdate() - "IH_GetterCritterScript.psc" Line 189
[08/14/2019 - 06:23:36PM] Error: Cannot divide by zero
stack:
[ (FF001380)].ih_gettercritterscript.GetClosestPointAtRadius() - "IH_GetterCritterScript.psc" Line 446
[ (FF001380)].ih_gettercritterscript.TranslateWithinRadiusCoords() - "IH_GetterCritterScript.psc" Line 415
[ (FF001380)].ih_gettercritterscript.OnUpdate() - "IH_GetterCritterScript.psc" Line 189

I have non-0 checks in both of these places, but Papyrus still throws these errors sometimes.

The first error there literally does not even have a divide, it's Papyrus complaining about a Math.sqrt(float afValue) call. For one, Math.sqrt(0) is a mathematically valid operation, and secondly, this still happens even when I explicitly check that afValue != 0 before trying to call that function. I have given up on trying to fix these, so just ignore it.