Paper Plugin Guide
File mode0

Start here

What is a plugin?

Servers, clients, Paper, and how a plugin jar changes what happens in the game.

Beginner27 min read

Before you write a plugin, it helps to know exactly what one is. On this page you will learn what a server does, where Paper comes from, how plugins differ from mods and datapacks, and what happens inside the server when it loads your plugin. You will also take a first look at a real plugin's code, so you can see its parts before you learn to write them.

The client and the server

When you play Minecraft with friends, two kinds of programs are involved.

  • The client is the game you start from the Minecraft launcher. It draws the world, plays sounds, and reads your keyboard and mouse.
  • The server is the program that actually runs the world. It decides where every mob walks, which blocks break, what drops, who has which items, and what everyone sees in chat.

The client asks; the server decides. When you click to break a block, your client tells the server "Steve wants to break this stone". The server checks that it is allowed, removes the block, drops the cobblestone, and then tells every nearby client "that stone is gone now". Your client just draws the result.

Players connect to one server Three players, each running the Minecraft client on their own computer, connect over the network to one server. The server runs Paper, and your plugins live inside Paper. Players Player 1 Minecraft client on their own PC Player 2 Minecraft client on their own PC Player 3 Minecraft client on their own PC network The server (one computer, one program) Paper the server software Worlds, blocks, mobs, players Paper runs the game rules Your plugin adds new behavior Other plugin someone else's Plugins live inside Paper and change how the game works
Every player's client talks to one server. The server runs the world and the plugins; the clients only show what the server tells them.

This is the most important idea on the page: plugins run on the server. Because the server makes every decision, a plugin that runs inside the server can change any decision. It can stop a block from breaking, give a player an item, or send a message, and every client simply shows the result.

What a plugin is

A plugin is a file, ending in .jar, that contains code written in Java. You drop it into the server's plugins folder, start the server, and the server runs your code alongside its own.

A server folder on Windows. Plugin jars go in the plugins folder; the server loads every jar it finds there when it starts.

Once loaded, a plugin can do three main kinds of things:

  • React to things that happen. A player joins, breaks a block, takes damage, opens a chest, chats. Each of these is an event, and your plugin can run code when it happens.
  • Add commands. Players type /rules or /home, and your code runs.
  • Change the game. Give items, teleport players, spawn mobs, show titles, edit blocks, save data, and much more.

That is all a plugin really is: code that the server runs when something happens or when someone types a command. Everything else (shops, minigames, anti-cheat) is built from those pieces.

A first look inside a plugin

Here is a small but complete plugin. It greets every player who joins and adds a /rules command. You do not need to understand the code yet; the next chapters teach every word. For now, just spot its three parts.

Two words will come up in the notes. A class is one Java file that holds a piece of your plugin, like a toolbox for one job. A method is one named action inside a class, like onEnable, that the server can run. The next chapters teach both properly.

Part 1: plugin.yml, a small text file that introduces the plugin to the server:

plugin.ymlCompiles on Paper 26.3Compile Lab
Where this file liveswhat-is-a-plugin-toursrcmainresourcesplugin.yml

Files in src/main/resources are copied into the jar exactly as they are. Paper looks for plugin.yml at the top of the jar.

  • what-is-a-plugin-tour/
    • src/main/
      • java/com/example/whatisaplugintour/Package com.example.whatisaplugintour
        • GreetingListener.javaListener: reacts to events
        • RulesCommand.javaCommand (BasicCommand)
        • TourPlugin.javaMain class: Paper starts here (named as main in plugin.yml)
      • resources/Files copied into the jar as they are
        • plugin.ymlyou are hereTells Paper the plugin's name, version and main class
    • build.gradle.ktsThe build recipe: Paper 26.3 API, Java 25, how the jar is made
    • gradle.propertiesVersion numbers used by the build
    • gradlew.batRuns Gradle on Windows without installing it
    • settings.gradle.ktsThe project's name

Gray files come with the project template; you rarely edit them. Open the whole project in the Compile Lab, or download it from the project page.

1name: TourPlugin2version: '1.0.0'3main: com.example.whatisaplugintour.TourPlugin4api-version: '26.3'5description: Greets players and adds a /rules command.
  1. The plugin's name. It appears in the console and in the /plugins list.
  2. Your plugin's version number. You raise it when you release a new version.
  3. The full name of the class the server should start. This is how the server finds your code inside the jar.
  4. The Minecraft version the plugin was written for, so the server knows how to treat it.
  5. A short description for people who read the file. It is optional.

Part 2: the main class, the code the server starts. It sets everything up:

TourPlugin.javaCompiles on Paper 26.3Compile Lab
Where this file liveswhat-is-a-plugin-toursrcmainjavacomexamplewhatisaplugintourTourPlugin.java

The package com.example.whatisaplugintour is the folder path com/example/whatisaplugintour inside src/main/java: every dot in the package name is one folder. IntelliJ creates these folders for you when you make a new package.

  • what-is-a-plugin-tour/
    • src/main/
      • java/com/example/whatisaplugintour/Package com.example.whatisaplugintour
        • GreetingListener.javaListener: reacts to events
        • RulesCommand.javaCommand (BasicCommand)
        • TourPlugin.javayou are hereMain class: Paper starts here (named as main in plugin.yml)
      • resources/Files copied into the jar as they are
        • plugin.ymlTells Paper the plugin's name, version and main class
    • build.gradle.ktsThe build recipe: Paper 26.3 API, Java 25, how the jar is made
    • gradle.propertiesVersion numbers used by the build
    • gradlew.batRuns Gradle on Windows without installing it
    • settings.gradle.ktsThe project's name

Gray files come with the project template; you rarely edit them. Open the whole project in the Compile Lab, or download it from the project page.

1package com.example.whatisaplugintour;2 3import org.bukkit.plugin.java.JavaPlugin;4 5public final class TourPlugin extends JavaPlugin {6 7    @Override8    public void onEnable() {9        getServer().getPluginManager().registerEvents(new GreetingListener(), this);10        registerCommand("rules", "Shows the server rules", new RulesCommand());11        getLogger().info("TourPlugin is enabled!");12    }13 14    @Override15    public void onDisable() {16        getLogger().info("TourPlugin is disabled. Bye!");17    }18}
  1. This makes the class a plugin. Every Paper plugin has exactly one class like this.
  2. The server runs this once, when it turns your plugin on. Setup goes here.
  3. "Server, please tell my GreetingListener whenever something happens." This hooks up part 3.
  4. Adds the /rules command and says which code runs when someone types it.
  5. Prints a line in the server console, so you can see the plugin started.
  6. The server runs this once, when it shuts down or turns the plugin off.

Part 3: the features. A listener that reacts to players joining, and a command:

GreetingListener.javaCompiles on Paper 26.3Compile Lab
Where this file liveswhat-is-a-plugin-toursrcmainjavacomexamplewhatisaplugintourGreetingListener.java

The package com.example.whatisaplugintour is the folder path com/example/whatisaplugintour inside src/main/java: every dot in the package name is one folder. IntelliJ creates these folders for you when you make a new package.

  • what-is-a-plugin-tour/
    • src/main/
      • java/com/example/whatisaplugintour/Package com.example.whatisaplugintour
        • GreetingListener.javayou are hereListener: reacts to events
        • RulesCommand.javaCommand (BasicCommand)
        • TourPlugin.javaMain class: Paper starts here (named as main in plugin.yml)
      • resources/Files copied into the jar as they are
        • plugin.ymlTells Paper the plugin's name, version and main class
    • build.gradle.ktsThe build recipe: Paper 26.3 API, Java 25, how the jar is made
    • gradle.propertiesVersion numbers used by the build
    • gradlew.batRuns Gradle on Windows without installing it
    • settings.gradle.ktsThe project's name

Gray files come with the project template; you rarely edit them. Open the whole project in the Compile Lab, or download it from the project page.

1package com.example.whatisaplugintour;2 3import org.bukkit.entity.Player;4import org.bukkit.event.EventHandler;5import org.bukkit.event.Listener;6import org.bukkit.event.player.PlayerJoinEvent;7 8public final class GreetingListener implements Listener {9 10    @EventHandler11    public void onJoin(PlayerJoinEvent event) {12        Player player = event.getPlayer();13        player.sendRichMessage("<green>Welcome! <gray>Type <yellow>/rules</yellow> to read the server rules.");14    }15}
  1. This class listens for events.
  2. "Run the method below when its event happens."
  3. Which event: a player joining.
  4. Sends a colored chat message to the player who just joined.
RulesCommand.javaCompiles on Paper 26.3Compile Lab
Where this file liveswhat-is-a-plugin-toursrcmainjavacomexamplewhatisaplugintourRulesCommand.java

The package com.example.whatisaplugintour is the folder path com/example/whatisaplugintour inside src/main/java: every dot in the package name is one folder. IntelliJ creates these folders for you when you make a new package.

  • what-is-a-plugin-tour/
    • src/main/
      • java/com/example/whatisaplugintour/Package com.example.whatisaplugintour
        • GreetingListener.javaListener: reacts to events
        • RulesCommand.javayou are hereCommand (BasicCommand)
        • TourPlugin.javaMain class: Paper starts here (named as main in plugin.yml)
      • resources/Files copied into the jar as they are
        • plugin.ymlTells Paper the plugin's name, version and main class
    • build.gradle.ktsThe build recipe: Paper 26.3 API, Java 25, how the jar is made
    • gradle.propertiesVersion numbers used by the build
    • gradlew.batRuns Gradle on Windows without installing it
    • settings.gradle.ktsThe project's name

Gray files come with the project template; you rarely edit them. Open the whole project in the Compile Lab, or download it from the project page.

1package com.example.whatisaplugintour;2 3import io.papermc.paper.command.brigadier.BasicCommand;4import io.papermc.paper.command.brigadier.CommandSourceStack;5import org.bukkit.command.CommandSender;6 7public final class RulesCommand implements BasicCommand {8 9    @Override10    public void execute(CommandSourceStack source, String[] args) {11        CommandSender sender = source.getSender();12        sender.sendRichMessage("<gold><bold>Server rules");13        sender.sendRichMessage("<gray>1. Be kind to other players.");14        sender.sendRichMessage("<gray>2. No griefing or stealing.");15        sender.sendRichMessage("<gray>3. Have fun!");16    }17}
  1. This class is a simple command.
  2. The server runs this every time someone types /rules.
  3. Who typed the command: a player, or the server console.
  4. Each line sends one chat message back to whoever typed the command.

This is what a player sees on a server running that plugin, first when joining and then after typing /rules:

Steve joined the game
Welcome! Type /rules to read the server rules.
Server rules
1. Be kind to other players.
2. No griefing or stealing.
3. Have fun!

Notice what is not there: no world, no mobs, no blocks, no networking code. The server already does all of that. Your plugin only adds the parts that make your server different, which is why a useful plugin can be this small.

Paper, Spigot, Bukkit and friends

Mojang, the company that makes Minecraft, gives away an official server program. People call it the vanilla server, because it is the plain flavor. The vanilla server cannot load plugins at all.

So the community built their own servers that can. Each new one was made by taking the previous one and improving it. Making a copy of a project and continuing it separately is called a fork.

Vanilla Mojang's server, no plugins Bukkit the first plugin API (CraftBukkit) Spigot faster, a bit more API Paper much more API, fixes, speed Purpur extra settings Folia many threads each arrow means "built from" Bukkit and Spigot plugins mostly run on Paper, Purpur (and Folia, if written for it) Plugins that use Paper's API run on Paper and Purpur, but not on Spigot
The family of plugin servers. Each one was built from the one before it, and each added more for plugins to use.
NameWhat it is
BukkitThe original plugin system. It defined the API (the list of things plugins are allowed to ask the server to do), and CraftBukkit was the server that ran it. The names org.bukkit and JavaPlugin you will see in your code come from here.
SpigotA fork of CraftBukkit that made it faster and added a little more API. For years it was the most common plugin server.
PaperA fork of Spigot. It fixes many bugs and exploits, runs much faster, and adds a very large API on top of Bukkit's: modern chat text, better commands, data components for items, and hundreds of extra events. This guide uses Paper 26.3.
PurpurA fork of Paper that adds many extra settings for server owners (rideable mobs, gameplay tweaks). Paper plugins run on it.
FoliaA fork of Paper for huge servers. It splits the world into regions that run on different processor cores at the same time. Plugins must be written specially for it; Folia and regionized scheduling explains how.

Why Paper?

Paper is the most popular plugin server, it is fast, it is updated quickly after each Minecraft release, and its API is the biggest and most modern. Almost every plugin written for Bukkit or Spigot also runs on Paper, so you lose nothing by choosing it.

For a long time Paper copied every change Spigot made and added its own on top. Then Paper made a hard fork: it stopped copying from Spigot and now develops completely on its own. In plain words, Paper is no longer "Spigot plus extras"; it is its own project. For you, that means one thing: code that uses Paper's newer API does not run on Spigot. Since this guide uses that newer API (because it is much easier and safer), your plugins will need Paper or a fork of Paper, like Purpur.

Plugins, mods, datapacks and resource packs

Plugins are not the only way to change Minecraft. Here is how the four common ways compare:

PluginModDatapackResource pack
Runs onThe server (Paper)The client, the server, or both (Fabric, NeoForge)Any server or world, even vanillaThe client
Players must install itNoUsually yes, if it adds new thingsNoThe server can send it automatically
Written inJavaJavaJSON files and command functionsImages, models, sounds, JSON
Good atServer rules and features: commands, menus, economies, minigames, protectionBrand new blocks, mobs, machines, dimensions, client features like minimapsRecipes, loot tables, advancements, world generation, command-based gamesNew textures, models, sounds and fonts
CannotAdd truly new block types or change how the client draws thingsWork on a normal vanilla or Paper server when it adds new content, unless players install it tooRun custom Java code or react to most eventsChange any game rules or behavior

The biggest advantage of plugins is the second row: players join with the normal game. Nobody has to download anything, install a mod loader or match your mod list. That is why almost every public server with custom features uses plugins.

Plugins and the others also work together. A plugin can send players a resource pack, so a "Magic Wand" item can have its own texture, and a server can use datapacks and plugins at the same time.

What plugins can do

Nearly everything you have seen on a big server is a plugin, or several plugins working together. A few examples, with what players see and the chapter that teaches it:

Welcome messages and titles (Events and listeners, Titles and boss bars):

Welcome! Have fun, Steve

Commands (Commands):

Teleporting you to home in 3 seconds. Do not move!

Custom items with names, descriptions and abilities (Items and ItemStacks):

Vein Miner

Menus that players click (Building GUI menus):

2: iron_sword, 4: bow, 6: potion

Minigames with timers and boss bars (The scheduler, Scoreboards):

Game starts in 7

Economies, protection and anti-cheat. A coins system is a plugin that stores a number for every player (Saving player data). Spawn protection is a plugin that cancels block breaking near spawn (Canceling events). An anti-cheat is a plugin that watches movement events and flags impossible ones.

You cannot break blocks at spawn.

How a server loads plugins

Every time the server starts, it goes through the same steps. Knowing them helps you read the console and understand why your plugin did (or did not) start.

What happens when the server starts and stops Steps in order: the server starts, reads the plugins folder, reads plugin.yml, creates the main class, calls onLoad, loads worlds, calls onEnable, then runs until the server stops and calls onDisable. 1. Server starts Paper boots 2. Reads the plugins folder 3. Reads plugin.yml 4. Creates your main class 5. onLoad() very early 6. Worlds load Paper loads them 7. onEnable() your setup code 8. Running 20 ticks a second 9. Server stops /stop or crash 10. onDisable() your cleanup Boxes with code names are the methods you write in your main class. Paper calls them for you. Read left to right, then continue on the next row
From starting the server to players joining: the server finds the jars, reads each plugin.yml, creates each main class, and then enables the plugins.
  1. The server looks in the plugins folder

    It finds every .jar file in plugins. Files in subfolders are ignored.

  2. It reads each plugin.yml

    Every plugin jar must contain a plugin.yml. The server reads the name, version, main class and api-version, and any other plugins this one needs. If the file is missing or broken, that plugin is skipped with an error.

  3. It creates each main class

    Using the main: line, the server finds your main class inside the jar and creates it. Then it calls the plugin's onLoad method (most plugins leave it empty). The console shows "Loading server plugin".

  4. It prepares the worlds

    The server loads the overworld, the nether and the end.

  5. It enables the plugins

    For each plugin, the server calls onEnable. This is where your plugin registers its listeners and commands. The console shows "Enabling". Plugins that depend on other plugins are enabled after them.

  6. Players can join

    The console prints "Done". From now on, your listeners and commands run whenever their events happen.

Here is what that looks like in the console of a Paper 26.3 server with our tour plugin installed (some lines left out):

Server console
[14:02:05 INFO]: [PluginInitializerManager] Initializing plugins...[14:02:05 INFO]: [PluginInitializerManager] Initialized 1 plugin[14:02:05 INFO]: [PluginInitializerManager] Bukkit plugins (1): - TourPlugin (1.0.0)[14:02:08 INFO]: Starting minecraft server version 26.3[14:02:08 INFO]: [TourPlugin] Loading server plugin TourPlugin v1.0.0[14:02:08 INFO]: Preparing level "world"[14:02:09 INFO]: Done preparing level "world" (0.912s)[14:02:09 INFO]: [TourPlugin] Enabling TourPlugin v1.0.0[14:02:09 INFO]: [TourPlugin] TourPlugin is enabled![14:02:10 INFO]: Done (4.871s)! For help, type "help"

The line TourPlugin is enabled! is the one our onEnable printed. When the server stops, the steps run backward: every plugin's onDisable runs ("Disabling TourPlugin v1.0.0", then our "Bye!" line), and then the worlds are saved.

What a jar is, and what compiling means

You write plugins as text: files ending in .java, full of words like public and sendRichMessage. This text is called source code. It is written for humans to read.

The server cannot run that text directly. First, a program called the Java compiler reads your source code, checks it for mistakes, and translates it into .class files. These contain bytecode: compact instructions for the JVM (the Java Virtual Machine, the engine that runs Java programs, including the Minecraft server itself). That translation step is called compiling.

From source file to a running plugin You write MyPlugin.java, javac turns it into MyPlugin.class files, Gradle packs them into a .jar, you put the jar in the server's plugins folder, and Paper loads it. You write MyPlugin.java source code javac the Java compiler checks and translates Compiled files MyPlugin.class code the JVM can run Gradle packs a jar the build tool ./gradlew build Plugin jar my-plugin-1.0.0.jar in build/libs Server folder plugins/ you copy the jar here Paper loads it on start Gradle runs javac for you, so you rarely call it by hand.
Your .java files are compiled into .class files, which are packed together with plugin.yml into one jar that the server can load.

A jar file ("Java archive") is just a zip file with a different ending. It holds the compiled classes and any other files the plugin needs. The tour plugin's jar looks like this inside:

  • TourPlugin-1.0.0.jar
    • META-INF/
      • MANIFEST.MFA small info file every jar has; the build creates it for you
    • com/example/whatisaplugintour/
      • TourPlugin.classThe compiled main class
      • GreetingListener.classThe compiled listener
      • RulesCommand.classThe compiled command
    • plugin.ymlCopied into the jar unchanged, so the server can read it

You will never build a jar by hand. A build tool called Gradle does it with one click: it downloads the Paper API, runs the compiler, and zips the result. Your toolbox introduces Gradle, and Your first plugin builds a real jar.

Compiling has a big bonus: the compiler catches many mistakes before your plugin ever reaches a server. If you misspell sendRichMessage, the compiler refuses to build the jar and tells you the exact line. That is much better than a plugin that crashes while players are online.

Java the language and Minecraft: Java Edition

The word "Java" means two different things, and beginners mix them up all the time:

  • Java, the programming language, made by Sun Microsystems in the 1990s and now run by Oracle and a big open community. Banks, phones and websites use it. You install it as a "JDK" (you will do that in Your toolbox).
  • Minecraft: Java Edition, the PC version of Minecraft. It is called that because it is written in the Java language, to tell it apart from Bedrock Edition (consoles, phones and the Windows store version), which is written in C++.

Paper is a Java Edition server, and Paper plugins are written in the Java language. Bedrock players cannot join a Java server on their own (a separate tool called Geyser can let them in, but that is outside this guide). And no, JavaScript is not Java either: it is a different language with a confusingly similar name.

Try it

Plugin, mod, datapack or resource pack?

For each idea, decide which tool fits best. Remember the rule: plugins run on the server and need no installs from players.

  1. Players type /spawn to teleport to the spawn point.
  2. Diamond swords get a new, glowing texture.
  3. A brand new machine block with its own model and moving parts, like the ones in big modpacks.
  4. A shop menu where players buy items with coins.
  5. A new crafting recipe for saddles, on a world with no server software at all (a singleplayer world).
  6. A minimap drawn in the corner of the player's screen.
Hint

Ask two questions for each idea: does it change rules and behavior, or only looks? And does the client need to draw something it does not know about?

Show the solution
  1. Plugin. A command that teleports is pure server behavior.
  2. Resource pack. Textures only change looks. (A plugin can send the pack to players automatically.)
  3. Mod. Truly new block types need a mod, and players must install it too. (Servers sometimes fake new blocks with a plugin plus a resource pack that retextures an existing block, but a real new machine is mod territory.)
  4. Plugin. Menus, coins and buying are all server logic.
  5. Datapack. Datapacks work in singleplayer and add recipes without any code. (On a Paper server, a plugin can add recipes too; see Custom crafting recipes.)
  6. Mod. Drawing new things on the client's screen needs client code. A plugin can only use what the normal client already has: chat, titles, boss bars, scoreboards and menus.
Try it

Add a rule to /rules

Open the tour plugin's RulesCommand in the Compile Lab (use the "Open in Compile Lab" button on the code block above). Add a new rule 3, "No hacked clients or x-ray.", and turn "Have fun!" into rule 4. Compile it to check it.

Hint 1

Each rule is one sender.sendRichMessage(...); line. Copy one of them and change its text.

Hint 2

Keep the order of the lines the same as the order you want in chat: the server sends them top to bottom.

Show the solution

One new line, and one changed number. The server runs the lines from top to bottom, so the chat shows them in that order.

RulesCommand.javaCompiles on Paper 26.3Compile Lab
Where this file liveswhat-is-a-plugin-exercisesrcmainjavacomexamplewhatisapluginexerciseRulesCommand.java

The package com.example.whatisapluginexercise is the folder path com/example/whatisapluginexercise inside src/main/java: every dot in the package name is one folder. IntelliJ creates these folders for you when you make a new package.

  • what-is-a-plugin-exercise/
    • src/main/
      • java/com/example/whatisapluginexercise/Package com.example.whatisapluginexercise
        • GreetingListener.javaListener: reacts to events
        • RulesCommand.javayou are hereCommand (BasicCommand)
        • TourPlugin.javaMain class: Paper starts here (named as main in plugin.yml)
      • resources/Files copied into the jar as they are
        • plugin.ymlTells Paper the plugin's name, version and main class
    • build.gradle.ktsThe build recipe: Paper 26.3 API, Java 25, how the jar is made
    • gradle.propertiesVersion numbers used by the build
    • gradlew.batRuns Gradle on Windows without installing it
    • settings.gradle.ktsThe project's name

Gray files come with the project template; you rarely edit them. Open the whole project in the Compile Lab, or download it from the project page.

9@Override10public void execute(CommandSourceStack source, String[] args) {11    CommandSender sender = source.getSender();12    sender.sendRichMessage("<gold><bold>Server rules");13    sender.sendRichMessage("<gray>1. Be kind to other players.");14    sender.sendRichMessage("<gray>2. No griefing or stealing.");15    sender.sendRichMessage("<gray>3. No hacked clients or x-ray.");16    sender.sendRichMessage("<gray>4. Have fun!");17}
  1. The new rule, copied from the line above and changed.
  2. The old rule 3, renumbered.
Server rules
1. Be kind to other players.
2. No griefing or stealing.
3. No hacked clients or x-ray.
4. Have fun!

Recap

  • The client draws the game; the server runs the world and makes every decision. Plugins run on the server, so players install nothing.
  • A plugin is a jar of compiled Java code. It reacts to events, adds commands and changes the game.
  • Every plugin has a plugin.yml and a main class that extends JavaPlugin; its onEnable runs when the server starts.
  • Bukkit came first, Spigot forked it, Paper forked Spigot and is now a hard fork with a much bigger API. Paper-API plugins run on Paper and its forks, not on Spigot.
  • Mods add truly new content but need installs; datapacks and resource packs change data and looks; plugins change server behavior.
  • Compiling turns .java source code into .class bytecode, and the build packs it with plugin.yml into a jar.
  • Java the language is not Minecraft: Java Edition, and neither is JavaScript.

Quick quiz

  1. Your plugin gives players a diamond when they join. Do your players need to install anything?

  2. How does the server know which class in your jar to start?

  3. Your plugin uses Paper's newer API. A friend runs a Spigot server. What happens if they install it?

  4. What does compiling do?

  5. When does a plugin's onEnable run?

Next steps

  • Your toolbox: install Java 25 and IntelliJ IDEA, and meet Gradle.
  • Your first plugin: write, run and see a plugin like the tour plugin in your own game.