Modding:General Best Practices
Please help improve this page by editing it.
Reason: "This article should be merged into Modding:Overview as well as the main articles for each section."
Prefixing
Prefix your object and table names with some unique ID.
For instance, alphabeardmods_{id}
. This will prevent namespace conflicts with official content and other mods in the future.
<?xml version="1.0" encoding="utf-8"?>
<objects>
<object Name="ALPHABEARDMODS_CoolNewSword" Load="Merge">
...
</object>
</objects>
Merging
Only include your content and the minimum changeset via Load="Merge"
in tables and object definitions.
Don't copy the whole contents of the game xml. You only need to include new content.
For objects and encounter tables, if you're editing an existing item you can use Load="Merge"
in it's tag and only specify new items. For example, if I wanted my mod to give chain mail a 2DV:
<?xml version="1.0" encoding="utf-8"?>
<objects>
<object Name="Chain Mail" Load="Merge">
<part Name="Armor" DV="2" />
</object>
</objects>
Random Functions
To avoid conflicts and to keep consistency between seeds, Stat.Random() and Stat.Rnd() should not be called. The ideal is to use GetSeededRandomGenerator() for your mod's randomness. The next best is calling RandomCosmetic() or Rnd2().
ObjectBlueprint Definitions
In general, unless you're defining a unique object, make sure you add the xml property Load="Merge"
to prevent breaking behavior.
Stats
Prefer using value
over sValue
, unless you're creating a unique creature. When loading ObjectBlueprints, the code loads both sValue
and value
into a stat, then if sValue
is set, prefers using that to set a stat over value
.
Harmony Patches
Harmony Patches are notoriously prone to causing instability and incompatibilities, for some advice on when and when not to use them, see Harmony Modding[1].