Line 13: |
Line 13: |
| |- | | |- |
| | [[/Events|Events]] | | | [[/Events|Events]] |
− | | Respond when something happens in the game (e.g. when a save is loaded), and often include details about what happened. | + | | Respond when something happens in the game (''e.g.,'' when a save is loaded), and often include details about what happened. |
| |- | | |- |
− | | [[/Config|Mod configuration]] | + | | [[/Config|Configuration]] |
− | | Let players edit a <tt>config.json</tt> file to configure your mod. | + | | Let players edit a <samp>config.json</samp> file to configure your mod. |
| |- | | |- |
| | [[/Content|Content]] | | | [[/Content|Content]] |
| | Load images/maps/data, and edit or replace the game's images/maps/data. | | | Load images/maps/data, and edit or replace the game's images/maps/data. |
| + | |- |
| + | | [[/Data|Data]] |
| + | | Store arbitrary data and retrieve it later. |
| + | |- |
| + | | [[/Input|Input]] |
| + | | Check and suppress keyboard, controller, and mouse state. |
| |- | | |- |
| | [[/Logging|Logging]] | | | [[/Logging|Logging]] |
Line 51: |
Line 57: |
| | [[/Integrations|Mod integrations]] | | | [[/Integrations|Mod integrations]] |
| | Get information about loaded mods, and integrate with mods using mod-provided APIs. | | | Get information about loaded mods, and integrate with mods using mod-provided APIs. |
| + | |- |
| + | | [[/Harmony|Harmony patching]] |
| + | | Harmony lets you patch or replace methods, effectively rewriting the game code. |
| |} | | |} |
| | | |
− | ==Mod APIs==
| + | [[es:Modding:Guía del Modder/APIs]] |
− | ===Reflection===
| + | [[zh:模组:制作指南/APIs]] |
− | SMAPI provides an API for robustly accessing fields, properties, or methods you otherwise couldn't access, such as private fields. You can use it from <tt>helper.Reflection</tt> in your entry method, or <tt>this.Helper.Reflection</tt> elsewhere in your entry class.
| |
− | | |
− | Here are a few examples of what this lets you do:
| |
− | | |
− | <source lang="c#">
| |
− | // did you pet your pet today? | |
− | bool wasPet = this.Helper.Reflection.GetField<bool>(pet, "wasPetToday").GetValue();
| |
− | | |
− | // what is the spirit forecast today?
| |
− | string forecast = this.Helper.Reflection
| |
− | .GetMethod(new TV(), "getFortuneForecast")
| |
− | .Invoke<string>();
| |
− | | |
− | // randomise the mines
| |
− | if(Game1.currentLocation is MineShaft)
| |
− | this.Helper.Reflection.GetField<Random>(Game1.currentLocation, "mineRandom").SetValue(new Random());
| |
− | </source>
| |
− | | |
− | This works with static or instance fields/methods, caches the reflection to improve performance, and will throw useful errors automatically when reflection fails.
| |
− | | |
− | If you need to do more, you can switch to [https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/reflection C#'s underlying reflection API]:
| |
− | | |
− | <source lang="c#">
| |
− | FieldInfo field = this.Helper.Reflection.GetField<string>(…).FieldInfo;
| |
− | MethodInfo method = this.Helper.Reflection.GetMethod(…).MethodInfo;
| |
− | </source>
| |
− | | |
− | ===Multiplayer===
| |
− | The multiplayer API provides methods to support modding in a multiplayer context:
| |
− | <source lang="c#">
| |
− | // get a unique multiplayer ID (e.g. for animal IDs)
| |
− | int uniqueID = this.Helper.Multiplayer.GetNewID();
| |
− | | |
− | // get the locations being sync'd from the main player
| |
− | foreach (GameLocation location in this.Helper.Multiplayer.GetActiveLocations())
| |
− | </source>
| |