Skip to content

Structuring your Thunderstore package

localcc edited this page Feb 16, 2024 · 12 revisions

Note: The required files in a Thunderstore package are:

  • A README.md
  • An icon.png
  • A manifest.json

By default all folders are ignored. Override folders are however a way of circumventing this issue and placing files in specific folders.

Should you need to load resources from a specific folder, please do this relative to your DLL using GetExecutingAssembly.

The newer, reliable, and easier method for doing this is by using Path.Combine(Path.GetDirectoryName(Plugin.Info.Location), "MySubDirectory", "MyImage.png").

Override folders

BepInEx

  • plugins
  • monomod (.mm.dll will implicitly install to a subdirectory within this folder)
  • patchers
  • core
  • config
  • Sideloader (H3VR only. Not for Outward.)
  • SlimVML (Designed for use with Valheim.)
  • Maps (Currently only for Timberborn.)
  • UMM Mods (Ultrakill only)
  • Assets (GTFO)
    • Note that this has install behaviour similar to MelonLoader.
    • Files are tracked and are not placed under a subdirectory.
  • GameData (GTFO)

MelonLoader

  • Mods (.dll)
  • Plugins (.plugin.dll)
  • MelonLoader
    • Managed (.managed.dll)
    • Libs (.lib.dll)
  • UserData
    • CustomItems (.melon)
    • CustomMaps (.bcm, .cma)
    • PlayerModels (.body)
    • CustomLoadScreens (.load)
    • Music (.wav)
    • Food (.food)
    • Scoreworks (.sw)
    • CustomSkins (.png)
    • Grenades (.grenade)

Understanding BepInEx Packaging

Every folder aside from /config has an unconditional subdirectory following the format of Author-ModName. This is to prevent file conflicts.

The default location for files that aren't in overriden directories is /BepInEx/plugins. The only exception is for files ending with .mm.dll which implies a /BepInEx/monomod folder installation.

An example zip structure:

# mod.zip
  - <required files>
  - patchers
    - my_patcher.dll
  - random_folder
    - test.dll
    - other_random_folder
      - other_test.dll
  - plugins
    - monomod
      - example_pm.dll
  - monomod
    - my_monomod.dll

will resolve to the following installation:

# <profile>/BepInEx/
  - patchers
    - <Author-ModName>
      - my_patcher.dll
  - plugins
    - <Author-ModName>
      - <required files>
      - test.dll
      - other_test.dll
      - monomod
        - example_pm.dll
  - monomod
    - <Author-ModName>
      - my_monomod.dll

Understanding MelonLoader Packaging

MelonLoader packaging is almost identical to BepInEx, however there's no <Author-ModName> folder.

Unlike BepInEx (besides .mm.dll), MelonLoader has some pre-configured file extensions that are automatically placed in their relevant directories.

Additionally, unlike with BepInEx supported games, the Thunderstore required files are not installed to the profile folder.

Example:

# mod.zip
  - <required files>
  - my_map.bcm
  - Items
    - a_custom_item.melon
  - CustomItems
    - my_item.item
    - another_custom_item.melon
  - UserData
    - CustomItems
      - a_third_custom_item.melon
    - Some Random Folder
      - unknown_file_type.xyz

will resolve to the following installation:

# <profile>/
  - UserData
    - CustomItems
      - a_custom_item.melon
      - my_item.item
      - another_custom_item.melon
      - a_third_custom_item.melon
    - CustomMaps
      - my_map.bcm
    - Some Random Folder
      - unknown_file_type.xyz

Understanding shimloader packaging

Palworld is the first game to use shimloader, you can find docs on packaging here