thunderstore prep, got rope storage working
This commit is contained in:
parent
ae461e46df
commit
c3ec0dfa0a
7
.editorconfig
Normal file
7
.editorconfig
Normal file
|
@ -0,0 +1,7 @@
|
|||
root = true
|
||||
|
||||
[*.cs]
|
||||
csharp_new_line_before_open_brace = none
|
||||
csharp_new_line_before_else = false
|
||||
csharp_new_line_before_catch = false
|
||||
csharp_new_line_before_finally = false
|
55
.github/workflows/build.yml
vendored
Normal file
55
.github/workflows/build.yml
vendored
Normal file
|
@ -0,0 +1,55 @@
|
|||
name: build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
tags:
|
||||
- 'v*'
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
permissions:
|
||||
contents: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Download libs-stripped
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
repository: nine-sols-modding/libs-stripped
|
||||
path: libs-stripped
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.0.x
|
||||
- name: Restore dependencies
|
||||
run: dotnet restore
|
||||
- name: Install tcli
|
||||
run: dotnet tool install -g tcli
|
||||
- name: Check against all game versions
|
||||
run: |
|
||||
cut -f1 -d' ' libs-stripped/versions.txt | while IFS= read -r version; do
|
||||
echo "Checking $version"
|
||||
dotnet build --no-restore -p:DllPath="$PWD/libs-stripped/$version"
|
||||
done
|
||||
- name: Publish build
|
||||
run: |
|
||||
publish_version=$(cut -f1 -d' ' libs-stripped/versions.txt | tail -n1)
|
||||
dotnet publish --no-restore -p:DllPath="$PWD/libs-stripped/$publish_version"
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: build
|
||||
path: |
|
||||
thunderstore/build/*.zip
|
||||
thunderstore/build/dll/*.dll
|
||||
- name: Release
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
files: |
|
||||
thunderstore/build/*.zip
|
||||
thunderstore/build/dll/*.dll
|
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
/.idea
|
||||
/.vs
|
||||
|
||||
/thunderstore/build
|
||||
obj
|
||||
bin
|
25
ExampleMod.sln
Normal file
25
ExampleMod.sln
Normal file
|
@ -0,0 +1,25 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.10.34928.147
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GlitchRestore", "Source\GlitchRestore.csproj", "{FC7FF0C4-8F9F-43B9-963F-5C8B3B8920AF}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{FC7FF0C4-8F9F-43B9-963F-5C8B3B8920AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{FC7FF0C4-8F9F-43B9-963F-5C8B3B8920AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{FC7FF0C4-8F9F-43B9-963F-5C8B3B8920AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{FC7FF0C4-8F9F-43B9-963F-5C8B3B8920AF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {2357817E-B903-4DD8-B0FD-64E75AAFD672}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -1,28 +0,0 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<AssemblyName>GlitchRestore</AssemblyName>
|
||||
<Product>My first plugin</Product>
|
||||
<Version>1.0.0</Version>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<RestoreAdditionalProjectSources>
|
||||
https://api.nuget.org/v3/index.json;
|
||||
https://nuget.bepinex.dev/v3/index.json;
|
||||
https://nuget.samboy.dev/v3/index.json
|
||||
</RestoreAdditionalProjectSources>
|
||||
<RootNamespace>GlitchRestore</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BepInEx.Analyzers" Version="1.*" PrivateAssets="all" />
|
||||
<PackageReference Include="BepInEx.Core" Version="5.*" />
|
||||
<PackageReference Include="BepInEx.PluginInfoProps" Version="2.*" />
|
||||
<PackageReference Include="UnityEngine.Modules" Version="2022.3.33" IncludeAssets="compile" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="'$(TargetFramework.TrimEnd(`0123456789`))' == 'net'">
|
||||
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.2" PrivateAssets="all" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,17 +0,0 @@
|
|||
using BepInEx;
|
||||
using BepInEx.Logging;
|
||||
|
||||
namespace GlitchRestore;
|
||||
|
||||
[BepInPlugin(MyPluginInfo.PLUGIN_GUID, MyPluginInfo.PLUGIN_NAME, MyPluginInfo.PLUGIN_VERSION)]
|
||||
public class Plugin : BaseUnityPlugin
|
||||
{
|
||||
internal static new ManualLogSource Logger;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
// Plugin startup logic
|
||||
Logger = base.Logger;
|
||||
Logger.LogInfo($"Plugin {MyPluginInfo.PLUGIN_GUID} is loaded!");
|
||||
}
|
||||
}
|
21
LICENSE.md
Normal file
21
LICENSE.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2024
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
6
NuGet.Config
Normal file
6
NuGet.Config
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<packageSources>
|
||||
<add key="BepInEx" value="https://nuget.bepinex.dev/v3/index.json" />
|
||||
</packageSources>
|
||||
</configuration>
|
59
README.md
Normal file
59
README.md
Normal file
|
@ -0,0 +1,59 @@
|
|||
# Nine Sols Example Mod
|
||||
|
||||
## Set up your mod
|
||||
1. Set up modding with BepInEx and r2modman: [Wiki: Getting Started](https://github.com/nine-sols-modding/Resources/wiki/Getting-started)
|
||||
1. download the `NineSolsAPI` mod if you want to use it,
|
||||
2. clone this repo ([generate from this template](https://github.com/new?template_name=NineSols-ExampleMod&template_owner=jakobhellermann), then update the `.csproj`
|
||||
1. Change `<AssemblyName>` to your mod name
|
||||
2. Make sure the `<NineSolsPath>` points to the installed game
|
||||
3. Install `tcli` tool for building thunderstore mods: `dotnet tool install -g tcli`
|
||||
4. Follow the **Building** section to make sure everything works as expected. Load into a game and press `Ctrl-H` to toggle your hat wherever you are.
|
||||
|
||||
_Next steps_:
|
||||
- setup hot reloading for faster iteration times
|
||||
- use a tool like [ILSpy](https://github.com/icsharpcode/ILSpy) or [dnSpy](https://github.com/dnSpy/dnSpy) to decompile the game code
|
||||
- check out the [UnityExplorer](https://thunderstore.io/c/nine-sols/p/ninesolsmodding/UnityExplorer/) mod to investigate objects in the game
|
||||
|
||||
## Building
|
||||
|
||||
If you run
|
||||
```sh
|
||||
dotnet publish
|
||||
```
|
||||
it will build the DLL of your mod (`Source/bin/Release/netstandard2.1/publish/ExampleMod.dll`), then use `tcli` to
|
||||
package the mod into a thunderstore-compatible zip in `thunderstore/build/`.
|
||||
|
||||
You can import that mod into your r2modman instance like this:
|
||||
<img alt="r2modman config to import local mod" src="https://github.com/user-attachments/assets/c8e02c83-5d71-4a65-89ef-acf93db85327" width="600">
|
||||
|
||||
|
||||
## Publishing
|
||||
|
||||
Make sure to fill out all fields in the [thunderstore.toml](./thunderstore/thunderstore.toml).
|
||||
Then go to https://thunderstore.io/c/nine-sols/create and upload your mod zip, or use tcli with a token created in
|
||||
[thunderstore.io](thunderstore.io) at `Settings / Teams / Service Accounts`:
|
||||
```sh
|
||||
tcli build --config-path ../thunderstore/thunderstore.toml --token $token
|
||||
```
|
||||
|
||||
## Hot Reloading
|
||||
|
||||
Building the mod and restarting the game after every minor change becomes cumbersome quickly. Luckily, BepInEx supports hot reloading of DLLs via [ScriptEngine](https://github.com/BepInEx/BepInEx.Debug).
|
||||
|
||||
Download the [ScriptEngine](https://thunderstore.io/c/nine-sols/p/ninesolsmodding/BepinExScriptEngine/) mod in your r2modman instance, and the game will be able to reload DLLs from `r2modmanProfileFolder/BepInEx/scripts/`.
|
||||
|
||||
Go into the `ExampleMod.csproj` file and fill out the `<ProfileDir>` and uncomment the `<CopyDir>` below it.
|
||||
Now, whenever you hit "Build" in your IDE, the mod DLL will be placed into that `scripts` folder.
|
||||
|
||||
Note: **Disable your mod in r2modman if it is active to prevent it from being loaded twice!**
|
||||
|
||||
By default, ScriptEngine will only reload scripts when you press `F6`, but you can go into r2modman's Config Editor and
|
||||
edit `BepInEx\config\com.bepis.bepinex.scriptengine.cfg` to have
|
||||
- `EnableFileSystemWatcher=true`
|
||||
- `AutoReloadDelay=0`
|
||||
- `LoadOnStart=true`
|
||||
|
||||
to reload scripts immediately.
|
||||
|
||||
Hot reloading works by first destroying your mod instance game objects and then reinstantiating them, so make sure to clean
|
||||
up any state you left in the `OnDestroy` callback.
|
81
Source/ExampleMod.cs
Normal file
81
Source/ExampleMod.cs
Normal file
|
@ -0,0 +1,81 @@
|
|||
using BepInEx;
|
||||
using BepInEx.Configuration;
|
||||
using HarmonyLib;
|
||||
using NineSolsAPI;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace GlitchRestore;
|
||||
|
||||
[BepInPlugin(MyPluginInfo.PLUGIN_GUID, MyPluginInfo.PLUGIN_NAME, MyPluginInfo.PLUGIN_VERSION)]
|
||||
public class ExampleMod : BaseUnityPlugin {
|
||||
// https://docs.bepinex.dev/articles/dev_guide/plugin_tutorial/4_configuration.html
|
||||
private ConfigEntry<bool> enableSomethingConfig = null!;
|
||||
private ConfigEntry<KeyboardShortcut> somethingKeyboardShortcut = null!;
|
||||
|
||||
private Harmony harmony = null!;
|
||||
|
||||
[HarmonyPatch(typeof(PlayerHurtState), nameof(PlayerHurtState.OnStateEnter))]
|
||||
internal static class RopeRestore {
|
||||
private static void Prefix(Player ___player, out ClimbableRope __state) {
|
||||
__state = ___player.touchingRope;
|
||||
}
|
||||
|
||||
private static void Postfix(ClimbableRope __state, ref Player ___player) {
|
||||
if (__state != null) {
|
||||
___player.touchingRope = __state;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//[HarmonyPatch(typeof(EffectDealer), nameof(EffectDealer.HitEffectSensorExitCheck))]
|
||||
//internal static class DamageRespawnRestore {
|
||||
//I think it's in EffectDealer but I'm not sure
|
||||
//}
|
||||
|
||||
private void Awake() {
|
||||
Log.Init(Logger);
|
||||
RCGLifeCycle.DontDestroyForever(gameObject);
|
||||
|
||||
// Load patches from any class annotated with @HarmonyPatch
|
||||
harmony = Harmony.CreateAndPatchAll(typeof(ExampleMod).Assembly);
|
||||
|
||||
enableSomethingConfig = Config.Bind("General.Something", "Enable", true, "Enable the thing");
|
||||
somethingKeyboardShortcut = Config.Bind("General.Something", "Shortcut",
|
||||
new KeyboardShortcut(KeyCode.H, KeyCode.LeftControl), "Shortcut to execute");
|
||||
|
||||
// Usage of the modding API is entirely optional.
|
||||
// It provides utilities like the KeybindManager, utilities for Instantiating objects including the
|
||||
// NineSols lifecycle hooks, displaying toast messages and preloading objects from other scenes.
|
||||
// If you do use the API make sure do have it installed when running your mod, and keep the dependency in the
|
||||
// thunderstore.toml.
|
||||
|
||||
KeybindManager.Add(this, TestMethod, () => somethingKeyboardShortcut.Value);
|
||||
|
||||
Logger.LogInfo($"Plugin {MyPluginInfo.PLUGIN_GUID} is loaded!");
|
||||
}
|
||||
|
||||
// Some fields are private and need to be accessed via reflection.
|
||||
// You can do this with `typeof(Player).GetField("_hasHat", BindingFlags.Instance|BindingFlags.NonPublic).GetValue(Player.i)`
|
||||
// or using harmony access tools:
|
||||
private static readonly AccessTools.FieldRef<Player, bool>
|
||||
PlayerHasHat = AccessTools.FieldRefAccess<Player, bool>("_hasHat");
|
||||
|
||||
private void TestMethod() {
|
||||
if (!enableSomethingConfig.Value) return;
|
||||
ToastManager.Toast("Shortcut activated");
|
||||
Log.Info("Log messages will only show up in the logging console and LogOutput.txt");
|
||||
|
||||
// Sometimes variables aren't set in the title screen. Make sure to check for null to prevent crashes.
|
||||
if (Player.i == null) return;
|
||||
|
||||
var hasHat = PlayerHasHat.Invoke(Player.i);
|
||||
Player.i.SetHasHat(!hasHat);
|
||||
}
|
||||
|
||||
private void OnDestroy() {
|
||||
// Make sure to clean up resources here to support hot reloading
|
||||
|
||||
harmony.UnpatchSelf();
|
||||
}
|
||||
}
|
70
Source/GlitchRestore.csproj
Normal file
70
Source/GlitchRestore.csproj
Normal file
|
@ -0,0 +1,70 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<AssemblyName>GlitchRestore</AssemblyName>
|
||||
<Description>Patch speedrun glitches from the speedrun branch back into the main branch game.</Description>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
<Version>1.0.0</Version>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<PublishRelease>true</PublishRelease>
|
||||
<NoWarn>MSB3277</NoWarn>
|
||||
|
||||
|
||||
<!-- todo macOS -->
|
||||
<NineSolsPath Condition="'$(OS)' == 'Windows_NT'">E:\SteamLibrary\steamapps\common\Nine Sols</NineSolsPath>
|
||||
<NineSolsPath Condition="'$(OS)' != 'Windows_NT'">$(HOME)/.local/share/Steam/steamapps/common/Nine Sols</NineSolsPath>
|
||||
<DllPath>$(NineSolsPath)/NineSols_Data/Managed</DllPath>
|
||||
|
||||
<!-- If you're not using R2Modman/Thunderstore, this can be NineSolsPath as well. Only used in CopyDir -->
|
||||
<ProfileDir Condition="'$(OS)' == 'Windows_NT'">E:\SteamLibrary\steamapps\common\Nine Sols</ProfileDir>
|
||||
<ProfileDir Condition="'$(OS)' != 'Windows_NT'">$(HOME)/.config/r2modmanPlus-local/NineSols/profiles/Default</ProfileDir>
|
||||
<!-- After building, copy the dll to this folder. Useful for hot-reloading: https://github.com/BepInEx/BepInEx.Debug/blob/master/README.md#scriptengine -->
|
||||
<CopyDir>$(ProfileDir)/BepInEx/scripts</CopyDir>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>$(DllPath)/Assembly-CSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="rcg.rcgmakercore.Runtime">
|
||||
<HintPath>$(DllPath)/rcg.rcgmakercore.Runtime.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="RCG_General">
|
||||
<HintPath>$(DllPath)/RCG_General.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="InControl">
|
||||
<HintPath>$(DllPath)/InControl.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BepInEx.Analyzers" Version="1.*" PrivateAssets="all" />
|
||||
<PackageReference Include="BepInEx.Core" Version="5.*" />
|
||||
<PackageReference Include="BepInEx.PluginInfoProps" Version="2.*" />
|
||||
<PackageReference Include="UnityEngine.Modules" Version="2022.3.18" IncludeAssets="compile" />
|
||||
|
||||
<!-- enable below if you want to use the API -->
|
||||
<PackageReference Include="NineSolsAPI" Version="1.2.1" />
|
||||
<!-- or locally <ProjectReference Include="../../NineSolsAPI/NineSolsAPI/NineSolsAPI.csproj" />-->
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="CheckReferences" BeforeTargets="BeforeBuild">
|
||||
<ItemGroup>
|
||||
<MissingReferences Include="@(Reference)" Condition="!Exists('%(Reference.HintPath)')" />
|
||||
</ItemGroup>
|
||||
<Error Condition="@(MissingReferences->Count()) > 0" Text="Missing reference(s);
|
||||
@(MissingReferences->'%(HintPath)', ',
')
|
||||
Did you forget to adjust your NineSolsPath '$(NineSolsPath)'?" />
|
||||
</Target>
|
||||
|
||||
<Target Name="CopyMod" AfterTargets="PostBuildEvent" Condition="'$(CopyDir)' != ''">
|
||||
<Message Importance="high" Text="copying $(TargetPath) to $(CopyDir) ..." />
|
||||
<Copy SourceFiles="$(TargetPath)" DestinationFolder="$(CopyDir)" SkipUnchangedFiles="true" />
|
||||
<Copy SourceFiles="$(TargetDir)$(TargetName).pdb" DestinationFolder="$(CopyDir)" SkipUnchangedFiles="true" />
|
||||
</Target>
|
||||
|
||||
<Target Name="PackageMod" AfterTargets="Publish">
|
||||
<Copy SourceFiles="$(TargetPath)" DestinationFolder="../thunderstore/build/dll" SkipUnchangedFiles="true" />
|
||||
<Exec Command="tcli build --config-path ../thunderstore/thunderstore.toml" />
|
||||
</Target>
|
||||
</Project>
|
23
Source/Log.cs
Normal file
23
Source/Log.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
using BepInEx.Logging;
|
||||
|
||||
namespace GlitchRestore;
|
||||
|
||||
internal static class Log {
|
||||
private static ManualLogSource? logSource;
|
||||
|
||||
internal static void Init(ManualLogSource logSource) {
|
||||
Log.logSource = logSource;
|
||||
}
|
||||
|
||||
internal static void Debug(object data) => logSource?.LogDebug(data);
|
||||
|
||||
internal static void Error(object data) => logSource?.LogError(data);
|
||||
|
||||
internal static void Fatal(object data) => logSource?.LogFatal(data);
|
||||
|
||||
internal static void Info(object data) => logSource?.LogInfo(data);
|
||||
|
||||
internal static void Message(object data) => logSource?.LogMessage(data);
|
||||
|
||||
internal static void Warning(object data) => logSource?.LogWarning(data);
|
||||
}
|
19
Source/Patches.cs
Normal file
19
Source/Patches.cs
Normal file
|
@ -0,0 +1,19 @@
|
|||
using HarmonyLib;
|
||||
|
||||
namespace ExampleMod;
|
||||
|
||||
[HarmonyPatch]
|
||||
public class Patches {
|
||||
|
||||
// Patches are powerful. They can hook into other methods, prevent them from runnning,
|
||||
// change parameters and inject custom code.
|
||||
// Make sure to use them only when necessary and keep compatibility with other mods in mind.
|
||||
// Documentation on how to patch can be found in the harmony docs: https://harmony.pardeike.net/articles/patching.html
|
||||
[HarmonyPatch(typeof(Player), nameof(Player.SetStoryWalk))]
|
||||
[HarmonyPrefix]
|
||||
private static bool PatchStoryWalk(ref float walkModifier) {
|
||||
walkModifier = 1.0f;
|
||||
|
||||
return true; // the original method should be executed
|
||||
}
|
||||
}
|
4
thunderstore/README.md
Normal file
4
thunderstore/README.md
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Nine Sols Example Mod
|
||||
|
||||
Write a description of your mod here, it will be displayed on thunderstore.
|
||||
Remember to update the icon.png to something representing your mod.
|
BIN
thunderstore/icon.png
Normal file
BIN
thunderstore/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
27
thunderstore/thunderstore.toml
Normal file
27
thunderstore/thunderstore.toml
Normal file
|
@ -0,0 +1,27 @@
|
|||
[config]
|
||||
schemaVersion = "0.0.1"
|
||||
|
||||
[package]
|
||||
namespace = "yournamespace"
|
||||
name = "YourModName"
|
||||
versionNumber = "0.1.0"
|
||||
description = "your mod description"
|
||||
websiteUrl = "link to the git repo"
|
||||
containsNsfwContent = false
|
||||
|
||||
[package.dependencies]
|
||||
"BepInEx-BepInExPack" = "5.4.2100"
|
||||
"ninesolsmodding-NineSolsAPI" = "0.0.2"
|
||||
|
||||
[build]
|
||||
icon = "./icon.png"
|
||||
readme = "./README.md"
|
||||
outdir = "./build"
|
||||
|
||||
[[build.copy]]
|
||||
source = "build/dll"
|
||||
target = "."
|
||||
|
||||
[publish]
|
||||
repository = "https://thunderstore.io"
|
||||
communities = [ "nine-sols" ]
|
Loading…
Reference in a new issue