-
Notifications
You must be signed in to change notification settings - Fork 6
Home
This guide introduces the modding workflow of Ammo through a tutorial for Skyrim SE, but the concepts are applicable to any supported game. This guide is for people who haven't used Ammo before, but assumes prior experience with modding and with tools like MO2 or Vortex.
By the end of this guide, you will:
- Be able to click "Play" in Steam to launch SKSE.
- Have beautiful next-gen lighting with no missing lights and no fake lights.
- Have realistic wetness effects in rainy weather.
- Have an unlocked framerate.
- Know how to use external modding tools like xEdit and DynDOLOD.
- Feel like a hacker as you install your favorite mods in bulk.
If you already know how to use Ammo but you're thirsty for more information, see https://deepwiki.com/cyberrumor/ammo/.
- A fresh installation of Skyrim SE through Steam (you have no manually installed mods and haven't used other mod organizers).
- Ammo is installed through pipx as per the instructions in the README.
- Vanilla Skyrim SE has been launched at least once through Steam (to create the initial ini files and necessary registry entries).
Many modern mods require d3dcompiler_47.dll and Microsoft Visual Code Redistributable. These aren't mods, but they need to be installed in the game's proton prefix. We can install and use protontricks to manage these types of dependencies. If you ever switch proton versions or delete your prefix, anything installed with protontricks will need to be reinstalled. Dotnet is also commonly required. Dotnet versions need to be installed on your host as well as within your proton prefix.
Notice the URL for Skyrim SE in the Steam store:
The 489830 number is Steam's App ID for Skyrim SE. If you ever need an App ID, find it from the game's page in the Steam store. Alternatively, you can use protontricks -s "Skyrim Special Edition".
For system install of steam:
- Install protontricks via pipx:
pipx install protontricks. - Install d3dcompiler_47.dll via protontricks:
protontricks 489830 d3dcompiler_47. - Download vc_redist.x64.exe.
- Execute vc_redist.x64.exe with
protontricks-launch --appid 489830 ~/Downloads/VC_redist.x64.exe. - Install all the dotnet packages from your distro's official package manager for each version of dotnet that you need across all your tools. This is typically going to be at least 8.0 and 9.0. E.g., in Arch,
sudo pacman -S dotnet-host dotnet-runtime dotnet-runtime-8.0 dotnet-sdk dotnet-sdk-8.0 dotnet-targeting-pack dotnet-targeting-pack-8.0 - Install dotnet versions into your prefix with:
protontricks 489830 dotnetdesktop8protontricks 489830 dotnetdesktop9
For flatpak install of steam:
- Install protontricks via flatpak:
flatpak install com.github.Matoking.protontricks - Install d3dcompiler_47.dll via protontricks:
flatpak run com.github.Matoking.protontricks 489830 d3dcompiler_47. - Download vc_redist.x64.exe.
- Execute vc_redist.x64.exe with
flatpak run com.github.Matoking.protontricks -c 'wine ~/Downloads/VC_redist.x64.exe' 489830 - Install dotnet 8 and dotnet 9 through flatpak:
flatpak install org.freedesktop.Sdk.Extension.dotnet8flatpak install org.freedesktop.Sdk.Extension.dotnet9
- Install dotnet versions into your prefix with:
flatpak run com.github.Matoking.protontricks 489830 dotnetdesktop8flatpak run com.github.Matoking.protontricks 489830 dotnetdesktop9
- Install flatseal through Flatpak:
flatpak install com.github.tchx84.Flatseal -
flatpak run com.github.com.tchx84.Flatseal- Use flatseal to add
~/.local/share/ammoto the list of "other files" that Steam is allowed to access. - If you've created symlinks under that directory, add the destination directories too. E.g.,
~/git/my_mod. - Do the same thing for protontricks.
- Use flatseal to add
An archive is a file ending in .7z, .rar, or .zip. A mod archive is an archive that contains a mod. Ammo doesn't distinguish between archives and mod archives. For this reason, we need a clean downloads folder to work with. Consider whether this is ~/Downloads for you, or some other folder. In any case, pop a terminal and launch ammo with ammo --downloads /path/to/my/empty/downloads/folder, replacing that path with your downloads folder. That path is your downloads folder.
Ammo has no Nexus integration (it doesn't need it). Simply use the Manual download button on the Nexus when downloading mod archives. Download mod archives to your downloads folder so Ammo can find them. It's a good idea to keep the tabs open for mods you've downloaded until after you've renamed them in Ammo. Otherwise it's easy to lose track of what version of a mod is installed.
Download the following mod archives to your downloads folder:
- skse
- Address Library for SKSE Plugins
- SSE Engine Fixes AIO
- SSE Display Tweaks
- powerofthree's Tweaks
- Base Object Swapper
- Xemi Utility
- Crash Logger SSE AE VR - PDB Support
- Light Placer
- Community Shaders
- CS Wetness Effects
- CS Inverse Square Lighting
- LPO - Config-based Lighting
- Standard Lighting Templates
- SkyPatcher
- Window Shadows Ultimate
- Dynamic Interior Ambient Lighting
- Skeleton Replacer HD - SE
When you launched ammo in your terminal, you would have landed in an interactive shell. I'll just call this interactive shell Ammo from now on.
Within Ammo, type refresh. This command abandons pending changes and reloads data from disk. We don't have any pending changes yet, but it should get your downloaded archives to show up. Find the SKSE mod archive, and take note of the number to the left of it. This number is the selector that Ammo's commands will use for the SKSE mod archive.
Let's extract it. Within Ammo, type install <index>. For example, install 2, but replace 2 with whatever number is associated with SKSE.
You should now see two different lists. One for downloaded mod archives, and one for extracted mods. You'll notice that the extracted SKSE mod has a [False] next to it. This indicates whether the mod will be installed into the game directory upon commit.
Also notice that each list tracks the index independently. E.g., you might see that the download list has a [0], but the extracted SKSE mod also has a [0]. Some commands, like install, only work on one type of component (in this case, a download), so they don't need a way to differentiate between each type of component (downloads, mods, and plugins). Other commands require the component type as an argument, so they know which list you're trying to interact with.
Let's activate the extracted SKSE mod. Within ammo, type activate mod 0. You'll see False has changed to True next to the SKSE mod, indicating it will be installed into the game directory upon commit. It hasn't been installed yet, however. We need to tell Ammo to write the pending configuration to the filesystem. We do this with the commit command, which you should execute now.
SKSE is now installed in your game directory, but Steam isn't using it yet. We have to give Steam a launch option so it executes skse64_loader.exe instead of SkyrimSELauncher.exe whenever you launch the game. Make Steam use the following launch option for Skyrim SE:
eval $( echo "%command%" | sed 's+SkyrimSELauncher.exe+/skse64_loader.exe+g' )
This launch option works by taking Steam's default launch command and replacing all its instances of SkyrimSELauncher.exe with skse64_loader.exe.
Launch Skyrim SE by clicking Steam's Play button. Once you're on the main menu, pop Skyrim's console with ~, type coc bleakfallsbarrow, and confirm you successfully load into the game.
When you're modding, it's a good idea to make a smaller number of changes between each time you test rather than a large number of changes. This is because you will inevitably break your game, and if you've only made one change for example, you'll know exactly what broke it, and therefore how to fix it. For the sake of brevity, this guide is going to blatantly violate that advice.
Quit Skyrim SE.
Ammo has two features that work closely together. One is the find command, which can be used to show only components with specific keywords, and the other is the all argument for the activate, deactivate, install, and delete commands.
Within Ammo, execute find standard. Notice that all components are now hidden except for the Standard Lighting Templates mod archive. When components are hidden like this, bulk commands (anything that uses the all argument) only operate on components you can see. Execute install all. Then execute find without arguments to show all components again. Notice that even though we said to install all, only Standard Lighting Templates was extracted. This is because it was the only component visible when we issued a command with all. With all components visible, execute install all again. This time all downloads will be extracted, since we can see all downloads. The install command is safe in that it won't replace mods when there's naming conflicts, like there is with SKSE and Standard Lighting Templates.
As you work, I would recommend abusing the find command and the all argument to quickly operate on multiple specific components at once. For example, at some point in the future you might wish to deactivate all of your grass mods while keeping everything else active. Instead of deactivating your grass mods one by one, you could just find grass, deactivate all, find. You can search for anything with find. The filter is additive, so if you execute find grass light, it will show all components that contain either "grass", "light", or both. It's case insensitive.
I digress. Now that all of our downloads are extracted, let's give them some better names.
Now would be a good time to rename extracted mods based off of their version. This is optional but recommended. You did keep those tabs open, right? You can rename mods with the rename mod command, followed by the index associated with the mod you want to rename, followed by the name you want. E.g., rename mod 0 skse_v2.2.6 (assuming SKSE still has mod index 0).
Take the time to rename each of your mods. If you fat finger an index and rename the wrong mod, you can use the log command to see what just happened (as long as you haven't completely quit then restarted Ammo since a bad operation).
Let's speed things up a bit and activate as many mods as we can at once. You can do this by executing activate mod all.
Notice that several mods weren't actually activated. This is because they are fomods, which are mods that require a user to make decisions about which files they should install before they can be used. You can configure a fomod with the configure command, but the configure command isn't allowed to work when there's pending changes, because it has to write data to the disk and doesn't want to save stuff without your explicit permission.
Execute commit to write pending changes to disk.
For each mod that wasn't activated, execute configure <index>, replacing <index> with whatever number is associated with that mod.
This will bring up the fomod configuration wizard. Here, you can simply type the number associated with a particular option to toggle that option. E.g., 1. Once the desired options are selected, you can execute n to go to the next page. If there's no more pages left, the wizard will automatically exit and write your selections to the disk.
For LPO, make sure to select the Eternal Flames option, as we'll be using it to confirm that BOS and Light Placer are both working. Also make sure you select the option to whitelist Window Shadows Ultimate.
Configure the rest of the inactive mods, then execute activate mod all and commit.
Since we have active mods that contain plugins (files ending in .esp, .esm, and .esl), you should see a third list with the word Plugins in the header. You can activate plugins in bulk with activate plugin all or specific plugins with activate plugin <index>.
Activate all plugins then commit.
Let's take a look at the order. The mods and plugins with the highest index (E.g., the bottom-most of each list) win conflicts for each list.
We can use the move command to arrange both mods and plugins. Let's sort our mods manually, then autosort our plugins based on our mod order.
Move mods around with move mod <index> <new_index>. E.g., move mod 5 3 to move whatever mod is at index 5 to index 3. Continue to do this until your mod load order looks like this:
index | Active | Mod name
-------|--------|------------
[0] [True] skse
[1] [True] Address_Library_for_SKSE_Plugins
[2] [True] SSE_Engine_Fixes_AIO
[3] [True] SSE_Display_Tweaks
[4] [True] powerofthrees_Tweaks
[5] [True] Base_Object_Swapper
[6] [True] Xemi_Utility
[7] [True] Crash_Logger_SSE_AE_VR_PDB_Support
[8] [True] Community_Shaders
[9] [True] CS_Wetness_Effects
[10] [True] CS_Inverse_Square_Lighting
[11] [True] Light_Placer
[12] [True] Skeleton_Replacer_HD_SE
[13] [True] LPO_Config_based_Lighting
[14] [True] Window_Shadows_Ultimate
[15] [True] SkyPatcher
[16] [True] Dynamic_Interior_Ambient_Lighting
[17] [True] Standard_Lighting_Templates
You'll notice that your plugin order didn't change this whole time. There's some restrictions by the game that ensures .esm and .esl plugins always load before .esp plugins, but besides this, you'll generally want your plugins to load in the same order as your mods.
Execute sort. This will automatically put your plugins in the same order as the mods they come from, making a few exceptions depending on the plugin suffix.
Execute commit to write the current state to the disk.
Launch Skyrim SE and run coc bleakfallsbarrow01 in Skyrim's console.
To test SkyPatcher / Dynamic Interior Ambient Lighting, wait until noon, then wait again until midnight. After each wait, you should notice the brightness of ambient light change based on the time of day.
To test Community Shaders, open the Community Shaders menu by using the end key (it might be fn+end or fn+<right arrow> on some keyboards). You should see a configuration menu open. Close it with the same keybind.
To test Base Object Swapper / Light Placer / LPO, run past the bandits and down the stairs. The fire sconce at the bottom of the stairs should have blue fire that emits blue light (there shouldn't be orange light in this area at all, besides the Bandit's campfire behind you).
To test Window Shadows Ultimate, coc whiterundragonsreach. Go up the stairs and into the kitchen on the left. Confirm there's shadow-casting light coming from the windows.
To test Standard Lighting Templates, coc markarthunderstonekeep. Go through the archway to the left into the room with Ancano. Look at the ceiling. Confirm there's no fog and that the ceiling isn't very bright.
Congrats, you have a basic mod setup!
If you want to uninstall any or all of these mods so you can build your own custom modlist, you can remove specific mods with delete mod <index>. If you want to uninstall everything to start completely from scratch (take care to fix steam's launch options if you want to remove SKSE), you can quickly return to vanilla like this:
-
find(show all mods) -
deactivate mod all(the bulk delete command intentionally prevents deleting enabled mods so you don't nuke your install by mistake) commitdelete mod all
If you get a warning like Skipped overwriting an unmanaged file, it's because a file that Ammo expected to be able to install (because it came from a mod that's been installed with Ammo) already exists in the game directory. This is usually caused by external tools like xEdit writing files directly to the data directory. Depending on the cause, you can resolve this in a few different ways.
If you didn't expect the file to exist in the game directory, you can simply delete that file from your game directory.
If you expected that file to exist, but you want to manage it with ammo to remove the warning, you'll need to move that file into a mod folder under ~/.local/share/ammo/Skyrim Special Edition/mods/my_arbitrary_mod_name/. Then refresh ammo and commit.
From Ammo, type in tools to enter the tools manager. This works much the same as the mod manager, but tools will be installed outside of your game folder (which is a behavior that some tools, like DynDOLOD, require). Tools are associated with specific games, so if you're managing multiple games that require the same tool, that tool will need to be installed and configured once per game.
You should use protontricks to launch external tools so they run in the same environment as the game.
If you're happy to launch these tools via terminal, then the scripts below should be of use to you. If you prefer to launch your scripts via GUI, you will need to also create appropriate .desktop files in ~/.local/share/application/ which launch these scripts. Creating these .desktop files is outside the scope of this document.
- Install SSEEdit with ammo then rename the tool to
sseedit. - Create
/usr/local/bin/sseeditwith the following contents:
#!/bin/bash
# Create a mod folder called "overwrite"
mkdir -p $HOME/.local/share/ammo/Skyrim\ Special\ Edition/mods/overwrite
# Launch sseedit set to output to the "overwrite" mod
protontricks-launch --appid 489830 $HOME/.local/share/ammo/Skyrim\ Special\ Edition/tools/sseedit/SSEEdit.exe -sse -o:$HOME/.local/share/ammo/Skyrim\ Special\ Edition/mods/overwrite -I:$HOME/.steam/steam/steamapps/compatdata/489830/pfx/drive_c/users/steamuser/Documents/My\ Games/Skyrim\ Special\ Edition/Skyrim.ini -p:$HOME/.steam/steam/steamapps/compatdata/489830/pfx/drive_c/users/steamuser/AppData/Local/Skyrim\ Special\ Edition/Plugins.txt
# If you're using flatpak installs for any of these, adjust your paths accordingly
# If the "overwrite" mod is an empty folder, delete it.
rmdir --ignore-fail-on-non-empty ~/.local/share/ammo/Skyrim\ Special\ Edition/mods/overwrite
- Make it executable with
sudo chmod +x /usr/local/bin/sseedit. - You can now launch
sseeditfrom a bash shell. - For QuickAutoClean, create a file
/usr/local/bin/quickautocleanwith the following contents:
#!/bin/bash
# Create a mod folder called "overwrite"
mkdir -p $HOME/.local/share/ammo/Skyrim\ Special\ Edition/mods/overwrite
# Launch sseedit set to output to the "overwrite" mod
protontricks-launch --appid 489830 $HOME/.local/share/ammo/Skyrim\ Special\ Edition/tools/sseedit/SSEEditQuickAutoClean.exe -sse -o:$HOME/.local/share/ammo/Skyrim\ Special\ Edition/mods/overwrite -I:$HOME/.steam/steam/steamapps/compatdata/489830/pfx/drive_c/users/steamuser/Documents/My\ Games/Skyrim\ Special\ Edition/Skyrim.ini -p:$HOME/.steam/steam/steamapps/compatdata/489830/pfx/drive_c/users/steamuser/AppData/Local/Skyrim\ Special\ Edition/Plugins.txt
# If the "overwrite" mod is an empty folder, delete it.
rmdir --ignore-fail-on-non-empty ~/.local/share/ammo/Skyrim\ Special\ Edition/mods/overwrite
- Make it executable with
sudo chmod +x /usr/local/bin/quickautoclean. - You can now launch
quickautocleanfrom a bash shell.
- Install SSELODGen with ammo then rename the tool to
sselodgen. Then create/usr/local/bin/sselodgenwith the following contents:
#!/bin/bash
# Create a mod folder called "lodgen_output"
mkdir -p $HOME/.local/share/ammo/Skyrim\ Special\ Edition/mods/lodgen_output
# Launch sselodgen set to output to the "lodgen_output" mod
protontricks-launch --appid 489830 $HOME/.local/share/ammo/Skyrim\ Special\ Edition/tools/sselodgen/SSELODGen.exe -sse -o:$HOME/.local/share/ammo/Skyrim\ Special\ Edition/mods/lodgen_output -I:$HOME/.steam/steam/steamapps/compatdata/489830/pfx/drive_c/users/steamuser/Documents/My\ Games/Skyrim\ Special\ Edition/Skyrim.ini -p:$HOME/.steam/steam/steamapps/compatdata/489830/pfx/drive_c/users/steamuser/AppData/Local/Skyrim\ Special\ Edition/Plugins.txt
# If the "lodgen_output" mod is an empty folder, delete it.
rmdir --ignore-fail-on-non-empty ~/.local/share/ammo/Skyrim\ Special\ Edition/mods/lodgen_output
- Make it executable with
sudo chmod +x /usr/local/bin/sselodgen. - Launch
sselodgenfrom a bash shell. - If you get errors about not being able to create a file, manually
mkdirthe path leading up to that file within your game's proton prefix.
- Install Nifskope with ammo then rename the tool to
nifskope. - Create a file
/usr/local/bin/nifskopewith the following contents:
#!/bin/bash
protontricks-launch --appid 489830 $HOME/.local/share/ammo/Skyrim\ Special\ Edition/tools/nifskope/NifSkope.exe
- Make it executable with
sudo chmod +x /usr/local/bin/nifskope. - Launch
nifskopefrom a bash shell.
- Create a file
/usr/local/bin/pgpatcherwith the following contents:
#!/bin/bash
# Create a mod folder called "pgpatcher_output"
mkdir -p $HOME/.local/share/ammo/Skyrim\ Special\ Edition/mods/pgpatcher_output
# Launch pgpatcher
protontricks-launch --appid 489830 $HOME/.local/share/ammo/Skyrim\ Special\ Edition/tools/pgpatcher/PGPatcher.exe
# If the "pgpatcher_output" mod is an empty folder, delete it.
rmdir --ignore-fail-on-non-empty ~/.local/share/ammo/Skyrim\ Special\ Edition/mods/pgpatcher_output
- Make it executable with
sudo chmod +x /usr/local/bin/pgpatcher - You might need to manually point the wizard at
~/.local/share/ammo/Skyrim\ Special\ Edition/mods/pgpatcher_output, and run it without the option to zip output.
- Create a file
/usr/local/bin/texgenwith the following contents:
#!/bin/bash
# Create a mod folder called "texgen_output"
mkdir -p $HOME/.local/share/ammo/Skyrim\ Special\ Edition/mods/texgen_output
# Launch texgen set to output to the "overwrite" mod
protontricks-launch --appid 489830 $HOME/.local/share/ammo/Skyrim\ Special\ Edition/tools/dyndolod/TexGenx64.exe -SSE -o:$HOME/.local/share/ammo/Skyrim\ Special\ Edition/mods/texgen_output -I:$HOME/.steam/steam/steamapps/compatdata/489830/pfx/drive_c/users/steamuser/Documents/My\ Games/Skyrim\ Special\ Edition/Skyrim.ini -p:$HOME/.steam/steam/steamapps/compatdata/489830/pfx/drive_c/users/steamuser/AppData/Local/Skyrim\ Special\ Edition/Plugins.txt
# If the "texgen_output" mod is an empty folder, delete it.
rmdir --ignore-fail-on-non-empty ~/.local/share/ammo/Skyrim\ Special\ Edition/mods/texgen_output
- Make it executable with
sudo chmod +x /usr/local/bin/texgen. - Launch
texgenfrom a bash shell. - When you run TexGen, make sure you select DXT5 as the compression algorithm or DynDOLOD will crash with "A call to an OS function failed"
- See https://stepmodifications.org/forum/topic/19354-linuxproton-a-call-to-an-os-function-failed/#comment-277538
- Install DynDOLOD with ammo then rename the tool to
dyndolod. - Create a file
/usr/local/bin/dyndolodwith the following contents:
#!/bin/bash
# Create a mod folder called "dyndolod_output"
mkdir -p $HOME/.local/share/ammo/Skyrim\ Special\ Edition/mods/dyndolod_output
# Launch dyndolod set to output to the "dyndolod_output" mod
protontricks-launch --appid 489830 $HOME/.local/share/ammo/Skyrim\ Special\ Edition/tools/dyndolod/DynDOLOD/DynDOLODx64.exe -SSE -o:$HOME/.local/share/ammo/Skyrim\ Special\ Edition/mods/dyndolod_output -I:$HOME/.steam/steam/steamapps/compatdata/489830/pfx/drive_c/users/steamuser/Documents/My\ Games/Skyrim\ Special\ Edition/Skyrim.ini -d:$HOME/.steam/steam/steamapps/common/Skyrim\ Special\ Edition/Data -m:$HOME/.steam/steam/steamapps/compatdata/489830/pfx/drive_c/users/steamuser/My\ Documents/My\ Games/Skyrim\ Special\ Edition -p:$HOME/.steam/steam/steamapps/compatdata/489830/pfx/drive_c/users/steamuser/AppData/Local/Skyrim\ Special\ Edition/Plugins.txt
# If the "dyndolod_output" mod is an empty folder, delete it.
rmdir --ignore-fail-on-non-empty ~/.local/share/ammo/Skyrim\ Special\ Edition/mods/dyndolod_output
- Make it executable with
sudo chmod +x /usr/local/bin/dyndolod. - You can now launch
dyndolodfrom a bash shell. - DynDOLOD requires proton version 10 or greater or it will error when trying to call texgen and/or lodgen.
- DynDOLOD crashes unless you use dxt5 compression when you run texgen.
- DynDOLOD requires that the Linux host has dotnet and dotnet framework installed. Get these from your package manager.