Difference between revisions of "Modding Tutorials/Modifying classes"

From RimWorld Wiki
Jump to navigation Jump to search
 
(One intermediate revision by the same user not shown)
Line 17: Line 17:
  
 
=Using Harmony to override a non-overridden method=
 
=Using Harmony to override a non-overridden method=
You can't. Patch the base class.
+
You can't. Harmony can only patch methods which are actually implemented. You can't patch what isn't there.
 +
 
 +
Alternatives:
 +
* [[Modding_Tutorials/Modifying_classes#Patching_the_base_class_of_a_subclass|Patch the base]] class instead, then check for the instance.
 +
* [[Modding_Tutorials/Modifying_classes#Adding_fields_or_methods_to_classes|Subclass]], and then replace it wherever it's created with Harmony.
  
 
=Patching the base class of a subclass=
 
=Patching the base class of a subclass=

Latest revision as of 15:22, 1 February 2019

Modding Tutorials

Changing methods[edit]

Use Harmony.

Adding fields or methods to classes[edit]

You can't. Not even with Harmony. Maybe you want to subclass instead?

Adding fields to Defs[edit]

You can. The game support something called a DefModExtension. If you have a Def, you can get your mod extension from it. This allows you to add any custom field to any def.

Adding behaviour to the Thing class[edit]

If it's a ThingWithComps, you can add a ThingComp instead. Almost all Things are a ThingWithComps. ThingComps can also be used to store whatever data you need.

Adding behaviour to the Hediff class[edit]

HediffWithComps also support comps. HediffComps are different from ThingComps, but their general use is the same.

Using Harmony to override a non-overridden method[edit]

You can't. Harmony can only patch methods which are actually implemented. You can't patch what isn't there.

Alternatives:

  • Patch the base class instead, then check for the instance.
  • Subclass, and then replace it wherever it's created with Harmony.

Patching the base class of a subclass[edit]

Harmony can only patch methods that actually have IL code. What you can do is patch the parent class. Let your patch take the __instance of the parent and pattern match.

if (!(__instance is SubClass))
    return;