Please note that this is the old documentation on the last version of Skript I released in 2014.
For up-to-date documentation, please visit the SkriptLang docs, the Skript Hub docs, or the skUnity docs.
Note: This page is targeted at plugin developers who want to extend Skript's capabilities. If you're a server admin check out the documentation instead.

First Steps

New Plugin

If you want to create a new add-on for Skript, simply create a new plugin as explained in the Bukkit wiki, and add depend: [Skript] to your plugin.yml. This will make sure that the add-on is only loaded if Skript is actually installed on the server, or generate an error otherwise, and it will also load after Skript.
For most add-ons you won't have to write any usual plugin code, only register new expressions, effects, classes, etc. to Skript using the methods explained below.

Existing Plugin

If you already have a plugin and want to hook into Skript, you have to add soft-depend: [Skript] to your plugin.yml, and add a check for whether Skript is installed on the server in your plugin's onEnable:
if (Bukkit.getPluginManager().getPlugin("Skript") != null) {
	// put all code related to Skript here
}
If you omit the check you'll get errors if Skript is not installed.

Creating new Syntax Elements

For each element you'll have to make a separate class and extend the correct base class: ch.njol.skript.lang.Effect for effects, ch.njol.skript.lang.Condition for conditions, and ch.njol.skript.lang.util.SimpleExpression or any class out of ch.njol.skript.expressions.base for expressions (The differences of these expression classes will be explained later on).

Now implement all required methods of the class you're extending. I hope that the Javadocs are clear enough to understand what to do, but if you don't understand something you can always ask questions.

Expressions

Like previously mentioned you have several classes you can extend to create new expressions:

Expressions also have several optional methods which you don't have to override, e.g. acceptChange, change, setTime, iterator, and isLoopOf.

Registering a new element

To make Skript aware of your new element use one of the static registerXyz methods in ch.njol.skript.Skript. Please note that Skript registers each element in its own class in a static {…} block which only works because of a small hack. You can either use the same method via a SkriptAddon instance received by Skript.registerAddon or simply register all your elements in onEnable().

Classes

If you want to use a custom class in your syntax elements you'll have to register that as well. Take a look at ch.njol.skript.classes.data.BukkitClasses for examples.

Patterns

When registering expressions, conditions and effects you have to provide a pattern to match your syntax element. Such a pattern will be matched 1:1 to the user's input except for the following constructs:

Please note that patterns are not checked for errors but may generate runtime errors while parsing if they are found to be invalid.

Maven Repository

If you're using Maven for your plugin, you can add Skript as dependency by adding the following to your pom.xml:
<dependencies>
	<dependency>
		<groupId>ch.njol</groupId>
		<artifactId>skript</artifactId>
		<version>2.0.1</version><!-- Use whatever version you want to depend on -->
		<scope>provided</scope>
	</dependency>
</dependencies>
<repositories>
	<repository>
		<id>njol-repo</id>
		<url>http://maven.njol.ch/repo/</url>
	</repository>
</repositories>

A Last Word

Please also take a look at all predefined syntax elements in ch.njol.skript.expressions/effects/conditions/events before asking too many questions ;).