We're going to rename the class to something nice and creative, like HelloKerbinMod. As a matter of good practices, remember to rename the file the class is in! (In VS2010, right-click the file and choose Rename.)

After compulsively re-indenting (VS2010: CTRL+E, D) it looks like this:

The Good Stuff

Extending PartModule

Part Modules all have one thing in common: They extend the PartModule class. The PartModule class defines a bunch of easy to use and intuitive methods and properties which you must override to do things with your module.

So, let's go ahead and extend PartModule. You don't need to add any using directives; It's in the global namespace as long as you have your KSP DLLs referenced correctly. However, you will need to add a using directive for the UnityEngine namespace in order to access debug functionality. Note that, again, compulsive cleanup was done.

DO NOT ADD A CONSTRUCTOR, Unity (and, by extension, KSP) DOESN'T LIKE CONSTRUCTORS!

Showing Up to Class

When a part module is first loaded, PartModule.OnStart(StartState state) is called. Here, we can set up low-level things like icons.

So, let's go ahead and override OnStart. You don't need the base.OnStart() stuff, so let's toss that and add some documentation like good programmers do. The override modifier isn't necessary, but it's good practice and will throw compile errors in case HarvesteR moves things around.

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingUnityEngine;namespace MyKSPProject
{/// <summary>/// My first part!/// </summary>publicclass HelloKerbinMod : PartModule
{/// <summary>/// Called when the part is started by Unity./// </summary>publicoverridevoid OnStart(StartState state){}}}

So we've got a method now, but it doesn't really do anything. So, let's just print something silly to the log.

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingUnityEngine;namespace MyKSPProject
{/// <summary>/// My first part!/// </summary>publicclass HelloKerbinMod : PartModule
{/// <summary>/// Called when the part is started by Unity./// </summary>publicoverridevoid OnStart(StartState state){// Add stuff to the log
print("Hello, Kerbin!");}}}

Cool! Now compile the DLL and find it - it should be YourSolution/YourProject/bin/Debug/MyKSPProject.dll. To install it, create GameData/MyKSPProject/Plugins/ inside KSP's GameData/ directory, and drop the DLL in your new Plugins/ directory.

Adding to a Part

By copying a part

Because we're just making a simple test part, make a copy of the "RCS block" directory and edit part.cfg. (As of 1.4.3, located in GameData\Squad\Parts\Utility and named rcsBlockRV-105)

Our part needs a name. Change the name = at the top of the file from RCSBlock to something like MyUselessPart.

Save the .cfg file. When you load the game, you'll discover that the RCS block is indeed there. And it doesn't do anything.

Or using ModuleManager

Alternately, you could begin as you should continue and use ModuleManager - a separate download - to patch the module into an existing part. Install ModuleManager.dll to GameData/ if you don't already have it.

Now create a new GameData/MyKSPProject/HelloKerbinMod_rcs.cfg file with Notepad++ or a similar text editor. Its contents should be:

// Modify the stock part "RCSBlock" from GameData/Squad/Parts/Utility/rcsBlockRV-105/rcsBlockRV-105.cfg
@PART[RCSBlock]{// Add a new module
MODULE
{// using the HelloKerbinMod PartModule subclass
name = HelloKerbinMod
}}

When you start KSP, existing RCS thrusters will now have your new module too!

Common Problems

Linux systems may be missing the PCL assembly libraries, which will cause compilation to fail due to their absence. Check the Setting up MonoDevelop page for more information. (No longer an issue in newer Mono, so only try to fix it if you have a problem).

Continuing the Legacy

Now it's your turn. Try overriding various methods in PartUpdate, like onUpdate. Over the coming weeks, more information can be found at Plugins.