Changes

3,496 bytes removed ,  14:29, 28 February 2022
ES link
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]]
===Content packs===
+
[[zh:模组:制作指南/APIs]]
A content pack is a sub-mod containing files your mod can read. These are installed just like a regular SMAPI mod, but don't do anything on their own. These must specify your mod in their <tt>manifest.json</tt>. See [[Modding:Content packs]] for more info about content packs.
  −
 
  −
SMAPI provides a method to get content packs loaded for your mod, and each content pack has an API you can use to read its files:
  −
<source lang="c#">
  −
foreach(IContentPack contentPack in this.Helper.GetContentPacks())
  −
{
  −
    // read content pack manifest
  −
    this.Monitor.Log($"Reading content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version}");
  −
 
  −
    // read a JSON file
  −
    YourDataFile data = contentPack.ReadJsonFile<YourDataFile>("content.json");
  −
 
  −
    // load an asset or image
  −
    Texture2D image = contentPack.LoadAsset<Texture2D>("image.png");
  −
}
  −
</source>
  −
 
  −
===Logging===
  −
Your mod can write messages to the console window and log file using the monitor. For example, this code:
  −
 
  −
<source lang="c#">
  −
this.Monitor.Log("a trace message", LogLevel.Trace);
  −
this.Monitor.Log("a debug message", LogLevel.Debug);
  −
this.Monitor.Log("an info message", LogLevel.Info);
  −
this.Monitor.Log("a warning message", LogLevel.Warn);
  −
this.Monitor.Log("an error message", LogLevel.Error);
  −
</source>
  −
 
  −
will log something like this:
  −
 
  −
<div style="font-family: monospace;">
  −
<span style="color:#666;">[18:00:00 TRACE Mod Name] a trace message</span><br />
  −
<span style="color:#666;">[18:00:00 DEBUG Mod Name] a debug message</span><br />
  −
<span style="color:black;">[18:00:00 INFO  Mod Name] an info message</span><br />
  −
<span style="color:darkorange;">[18:00:00 WARN  Mod Name] a warning message</span><br />
  −
<span style="color:red;">[18:00:00 ERROR Mod Name] an error message</span>
  −
</div>
  −
 
  −
Note that <tt>LogLevel.Trace</tt> messages won't appear in the console window by default, they'll only be written to the log file. Trace messages are for troubleshooting details that are useful when someone sends you their error log, but which the player normally doesn't need to see. (You can see trace messages in the console if you install the "SMAPI for developers" version.)
  −
 
  −
===Reflection===
  −
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>
 
232

edits