plugin.yml explained
Every field in plugin.yml, which ones are required, and the mistakes that stop a plugin loading.
plugin.yml is the small text file that introduces your plugin to Paper: its name, its version, where its main class is, and what it needs. On this page you will learn every field, which ones are required, how YAML works, and how to read the errors Paper prints when the file is wrong.
What plugin.yml is for
A plugin jar is just a zip file full of compiled classes. When the server starts, Paper opens every jar in the plugins folder and looks for one file at the top level: plugin.yml. That file is your plugin's ID card. Without it, Paper does not even know the jar is a plugin.
From plugin.yml, Paper learns:
- what the plugin is called and which version it is,
- which class to create as the main class (the one that extends
JavaPlugin, see the plugin lifecycle), - which Minecraft version it was written for,
- which other plugins it needs, and which permissions it uses.
Paper reads all of this before it runs any of your Java code. That is why a mistake in plugin.yml stops your plugin from loading at all, no matter how good your code is.
In your project, the file lives in src/main/resources. When you build, Gradle copies everything in that folder into the jar, so plugin.yml ends up at the top of the jar where Paper looks for it:
- my-plugin/
- src/
- main/
- java/
- com/example/pluginymlminimal/
- HelloYamlPlugin.javaThe main class that plugin.yml points to
- com/example/pluginymlminimal/
- resources/
- plugin.ymlCopied into the top of the jar when you build
- java/
- main/
- src/
The smallest plugin.yml that works
Four fields are required. Here is a complete, working plugin.yml with nothing else in it:
Where this file livesplugin-yml-minimalsrcmainresourcesplugin.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.
- plugin-yml-minimal/
- src/main/
- java/com/example/pluginymlminimal/Package com.example.pluginymlminimal
- HelloYamlPlugin.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
- java/com/example/pluginymlminimal/Package com.example.pluginymlminimal
- 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
- src/main/
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: HelloYaml2version: '1.0.0'3main: com.example.pluginymlminimal.HelloYamlPlugin4api-version: '26.3'- The plugin's name. It shows up in the console as
[HelloYaml], in the/pluginslist, and as the name of its data folder,plugins/HelloYaml/. Other plugins use this exact name to depend on yours. - Your plugin's version. Paper shows it in the logs ("Enabling HelloYaml v1.0.0") and in
/version HelloYaml. Raise it every time you give a new jar to someone. The quotes matter; you will see why below. - The full name of your main class: the
package , a dot, and the class name. It must match your Java file exactly, including capital letters. - The Minecraft version your plugin was written for. For this guide that is always
'26.3', in quotes.
And the main class it points to:
Where this file livesplugin-yml-minimalsrcmainjavacomexamplepluginymlminimalHelloYamlPlugin.java
The package com.example.pluginymlminimal is the folder path com/example/pluginymlminimal 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.
- plugin-yml-minimal/
- src/main/
- java/com/example/pluginymlminimal/Package com.example.pluginymlminimal
- HelloYamlPlugin.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
- java/com/example/pluginymlminimal/Package com.example.pluginymlminimal
- 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
- src/main/
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.pluginymlminimal;2 3import org.bukkit.plugin.java.JavaPlugin;4 5public final class HelloYamlPlugin extends JavaPlugin {6 7 @Override8 public void onEnable() {9 getLogger().info("Paper found me through plugin.yml.");10 }11}- The package. Put a dot and the class name after it, and you get exactly the
main:value:com.example.pluginymlminimal.HelloYamlPlugin. - The class name. It must match the file name,
HelloYamlPlugin.java, and the last part ofmain:.
The four required fields in detail
name may only contain letters, digits, underscores, periods and dashes. Avoid spaces: they are turned into underscores or refused, depending on the loader. Paper also refuses the names Bukkit, Minecraft and Mojang. Choose a name once and keep it: renaming later moves the data folder and breaks every plugin that depends on yours.
version can be any text, but most developers use three numbers: '1.4.2'. Releasing and sharing your plugin explains what each number means.
main is the most common reason a new plugin does not load. If you rename the package or the class in IntelliJ, you must change this line too, because IntelliJ does not always update it for you.
api-version tells Paper which version of the API you wrote against. If it is newer than the server (say '26.4' on a 26.3 server), Paper refuses to load the plugin, because it cannot promise that your code will work. If it is missing completely, Paper treats your plugin as a very old plugin from before Minecraft 1.13, prints a warning, and turns on a slow compatibility mode. So always include it.
YAML in five minutes
plugin.yml is written in YAML, a format for writing data that people can read. You will use the same format for config.yml in Configuration files, so it pays to learn the rules once.
Keys and values
Each line is a key, a colon, a space, and a value. The space after the colon is required.
1name: ServerInfo2website: https://example.com/serverinfoNesting with indentation
A key can hold more keys inside it instead of a value. You show that by indenting the inner keys. This is how permissions are written:
1permissions:2 serverinfo.news:3 description: See the server news when joining.4 default: trueRead it like folders: permissions contains serverinfo.news, which contains description and default. The rules:
- Use spaces, never tabs. A single tab character makes the whole file invalid. IntelliJ inserts spaces when you press Tab in a YAML file, but text copied from websites sometimes contains real tabs.
- Be consistent. Two spaces per level is the usual choice. Keys at the same level must start in exactly the same column.
Lists
Some fields hold a list of values. YAML has two ways to write a list, and both mean the same thing:
1authors: [Jace, Alex]1authors:2 - Jace3 - AlexA list with one item is still a list: depend: [Vault]. Writing depend: Vault without the brackets is a classic mistake, and Paper refuses it.
Why the quotes around versions?
YAML guesses the type of every value. true becomes true/false, 42 becomes a number, and anything else becomes text. That guessing causes a nasty surprise with versions:
1version: 1.10YAML reads 1.10 as the decimal number one point one, and Paper shows your plugin as version 1.1. The same thing would happen to an api-version like 26.10. Quotes tell YAML "this is text, do not guess", so '1.10' stays exactly 1.10. Quote every version, every time, and the problem can never happen.
A bigger plugin.yml
Most real plugins use a few more fields. This example belongs to a small plugin called ServerInfo, which greets players with server news and shows staff some extra details:
Where this file livesplugin-yml-fullsrcmainresourcesplugin.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.
- plugin-yml-full/
- src/main/
- java/com/example/pluginymlfull/Package com.example.pluginymlfull
- NewsListener.javaListener: reacts to events
- ServerInfoPlugin.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
- java/com/example/pluginymlfull/Package com.example.pluginymlfull
- 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
- src/main/
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: ServerInfo2version: '1.2.0'3main: com.example.pluginymlfull.ServerInfoPlugin4api-version: '26.3'5description: Greets players with server news and shows staff extra details.6authors: [Jace, Alex]7contributors: [Steve]8website: https://example.com/serverinfo9prefix: Info10load: POSTWORLD11softdepend: [LuckPerms]12permissions:13 serverinfo.news:14 description: See the server news when joining.15 default: true16 serverinfo.details:17 description: See plugin details when joining.18 default: op19 serverinfo.admin:20 description: Everything ServerInfo offers.21 default: op22 children:23 serverinfo.news: true24 serverinfo.details: true- One sentence about what the plugin does.
/version ServerInfoshows it to server owners. - A list of the people who wrote the plugin. For one person you may write
author: Jaceinstead. - People who helped but are not the main authors.
- Where people find the plugin's page, docs or support.
- Changes the name in front of your console lines. With this line the logger prints
[Info]instead of[ServerInfo]. Most plugins leave it out. - When the plugin is enabled.
POSTWORLD, the default, means after the worlds load.STARTUPmeans before. - Plugins this one works with if they are installed. Paper enables them first when they are there, and loads ServerInfo anyway when they are not.
- The permissions this plugin checks, with a description and a default for each one.
- Everyone has this permission unless a permissions plugin takes it away.
- Only server operators have it, unless a permissions plugin grants it.
- Having
serverinfo.adminalso gives both of these. One node gives a whole set of rights.
The code can read every one of these values back through getPluginMeta(), so you never have to repeat them in Java:
Where this file livesplugin-yml-fullsrcmainjavacomexamplepluginymlfullServerInfoPlugin.java
The package com.example.pluginymlfull is the folder path com/example/pluginymlfull 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.
- plugin-yml-full/
- src/main/
- java/com/example/pluginymlfull/Package com.example.pluginymlfull
- NewsListener.javaListener: reacts to events
- ServerInfoPlugin.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
- java/com/example/pluginymlfull/Package com.example.pluginymlfull
- 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
- src/main/
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.pluginymlfull;2 3import io.papermc.paper.plugin.configuration.PluginMeta;4import org.bukkit.plugin.java.JavaPlugin;5 6public final class ServerInfoPlugin extends JavaPlugin {7 8 @Override9 public void onEnable() {10 PluginMeta meta = getPluginMeta();11 getLogger().info(meta.getName() + " " + meta.getVersion() + " by " + String.join(", ", meta.getAuthors()));12 getLogger().info("Website: " + meta.getWebsite());13 getLogger().info("Load order: " + meta.getLoadOrder());14 15 boolean luckPermsFound = getServer().getPluginManager().isPluginEnabled("LuckPerms");16 if (luckPermsFound) {17 getLogger().info("LuckPerms is installed, so ranks can get the serverinfo permissions.");18 } else {19 getLogger().info("LuckPerms is not installed. That is fine, it is only a soft dependency.");20 }21 22 getServer().getPluginManager().registerEvents(new NewsListener(meta), this);23 }24}PluginMetaisplugin.ymlas a Java object. Saving it in a variable keeps the next lines short.- The
authorslist.String.joinglues the names together with a comma between them. - The
websiteline, as text. - The
loadline, as one of the two valuesSTARTUPorPOSTWORLD. - Asks whether LuckPerms is installed and running. Because
softdependmakes Paper enable LuckPerms first, the answer is already correct insideonEnable. - The listener gets the metadata through its constructor, so it can show the name and version.
[14:02:07 INFO]: [Info] Enabling ServerInfo v1.2.0[14:02:07 INFO]: [Info] ServerInfo 1.2.0 by Jace, Alex[14:02:07 INFO]: [Info] Website: https://example.com/serverinfo[14:02:07 INFO]: [Info] Load order: POSTWORLD[14:02:07 INFO]: [Info] LuckPerms is not installed. That is fine, it is only a soft dependency.The listener uses the two permissions from plugin.yml:
Where this file livesplugin-yml-fullsrcmainjavacomexamplepluginymlfullNewsListener.java
The package com.example.pluginymlfull is the folder path com/example/pluginymlfull 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.
- plugin-yml-full/
- src/main/
- java/com/example/pluginymlfull/Package com.example.pluginymlfull
- NewsListener.javayou are hereListener: reacts to events
- ServerInfoPlugin.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
- java/com/example/pluginymlfull/Package com.example.pluginymlfull
- 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
- src/main/
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.
18@EventHandler19public void onJoin(PlayerJoinEvent event) {20 Player player = event.getPlayer();21 if (player.hasPermission("serverinfo.news")) {22 player.sendRichMessage("<gold>News:</gold> <gray>The new spawn opens this weekend!");23 }24 if (player.hasPermission("serverinfo.details")) {25 player.sendRichMessage("<dark_gray>Running <name> <version>",26 Placeholder.unparsed("name", meta.getName()),27 Placeholder.unparsed("version", meta.getVersion()));28 }29}- True for everyone, because the permission's default is
true. - True for operators, and for anyone given
serverinfo.detailsorserverinfo.admin.
An operator who joins sees both lines; everyone else sees only the news:
News: The new spawn opens this weekend!
Running ServerInfo 1.2.0
Every field at a glance
| Field | Required? | Example | What it does |
|---|---|---|---|
name | Yes | ServerInfo | The plugin's name everywhere. |
version | Yes | '1.2.0' | Shown in logs and /version. |
main | Yes | com.example.pluginymlfull.ServerInfoPlugin | The class Paper creates. |
api-version | Yes, in practice | '26.3' | The game version you wrote the plugin for. |
description | No | Greets players... | One sentence about the plugin. |
author / authors | No | [Jace, Alex] | Who wrote it. |
contributors | No | [Steve] | Who helped. |
website | No | https://... | Where to find out more. |
prefix | No | Info | The name in front of your console lines. |
load | No | STARTUP | Enable before the worlds load instead of after. |
depend | No | [Vault] | Plugins that must be installed; they are enabled first. |
softdepend | No | [LuckPerms] | Plugins you use if present; they are enabled first. |
loadbefore | No | [Essentials] | Plugins that should be enabled after yours. |
libraries | No | [org.apache.commons:commons-lang3:3.17.0] | Java libraries Paper downloads for you at startup. |
folia-supported | No | true | Says the plugin is safe on Folia. Paper ignores it. |
permissions | No | see above | Permission descriptions, defaults and children. |
commands | No | see below | Classic plugin.yml commands. |
You do not need to type any of this from memory. The plugin.yml Builder asks you a few questions and writes a valid file for you.
load: STARTUP
Almost every plugin should leave load out. STARTUP is for the rare plugin that must run before the worlds exist, such as a custom world generator that the server needs while it creates the worlds. A STARTUP plugin cannot use any world in onEnable, because there are none yet.
depend, softdepend and loadbefore
These three fields control the order in which plugins are enabled. Use them when your plugin talks to another plugin:
1depend: [Vault]2softdepend: [LuckPerms, PlaceholderAPI]3loadbefore: [Essentials]depend: "I cannot work without these." If Vault is missing, Paper does not load your plugin and printsUnknown/missing dependency plugins: [Vault]. Please download and install these plugins to run 'ServerInfo'.softdepend: "I use these if they are installed." Your plugin always loads, after them if they are there. Check withisPluginEnabledbefore using them.loadbefore: "Enable me before these." Rarely needed, for example when another plugin should see something yours sets up.
The names must match the other plugin's own name exactly, capital letters included. Working with other plugins shows how to actually use Vault, LuckPerms and PlaceholderAPI from your code.
libraries
1libraries:2 - org.apache.commons:commons-lang3:3.17.0Each entry is a Java library written as group:name:version, the same way you would add it in Gradle. When the server starts, Paper downloads it from Maven Central and makes it available to your plugin, so you do not have to pack it into your jar. You still add it to build.gradle.kts as compileOnly so your code compiles. Gradle and Maven reference covers dependencies.
folia-supported
Folia is a version of Paper that runs different areas of the world on different threads. It only loads plugins that say folia-supported: true, because most plugins are not safe there. Paper itself ignores the line. Only add it once your plugin really follows Folia's rules.
permissions
Each permission can have a description, a default and children. The default decides who has the permission when no permissions plugin says otherwise:
default | Who has it |
|---|---|
true | Everyone. |
false | Nobody, not even operators, until it is granted. |
op | Server operators. This is the default when you leave the line out. |
not op | Everyone who is not an operator. |
Permissions explains nodes, children and permissions plugins in depth.
commands (the classic way)
Older tutorials declare every command in plugin.yml:
1commands:2 spawnzombie:3 description: Spawns a zombie next to you.4 usage: /spawnzombie [amount]5 aliases: [sz]6 permission: myplugin.spawnzombieThis still works for plugin.yml plugins, together with getCommand("spawnzombie").setExecutor(...) in your code. New code should register commands in Java instead, which needs nothing in plugin.yml: see Commands, part 1. Commands, part 3 teaches the classic style so you can read older code.
When plugin.yml is wrong
Paper reads plugin.yml before it runs your code, so a mistake here means your plugin never starts. You will not see "Enabling YourPlugin" in the console, and /plugins does not list it at all. Instead there is an ERROR near the top of the console log, before the worlds load. Scroll up, or open logs/latest.log, and look for these lines. Each one names the problem clearly once you know what to look for:
| The console says | What is wrong | Fix |
|---|---|---|
Cannot find main class `com.example.shop.ShopPlugin' | main names a class that is not in the jar: a typo, a wrong package, or a renamed class. | Copy the package line from your Java file, add a dot and the class name. |
main class `...' must extend JavaPlugin | main points at the wrong class, such as a listener. | Point it at the class that extends JavaPlugin. |
found character '\t(TAB)' that cannot start any token | A tab character is used for indentation. | Replace tabs with spaces. The message also gives the line number. |
mapping values are not allowed here | Usually a missing space after a colon, or a value that contains : and needs quotes. | Check the line number in the message. |
name 'Shop Signs!' contains invalid characters. | The name has characters that are not allowed. | Use only letters, digits, _, . and -. |
main is not defined (or name, version) | A required field is missing or misspelled. | Add it. Keys are case sensitive: Main: is not main:. |
softdepend is of wrong type | A list field holds a single value. | Write softdepend: [LuckPerms] with brackets. |
Unknown/missing dependency plugins: [Vault] | A plugin from depend is not installed. | Install it, or move it to softdepend if you can live without it. |
Here is the main class error as it really looks, shortened to the important lines. The Caused by line underneath repeats the class name Java tried to find:
org.bukkit.plugin.InvalidPluginException: Cannot find main class `com.example.shopsigns.ShopSignsPlugin' at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:84) ~[paper-api-26.3.build.142-beta.jar:?] ...Caused by: java.lang.ClassNotFoundException: com.example.shopsigns.ShopSignsPluginIf you are not sure what an error means, paste it into the Error Doctor.
plugin.yml or paper-plugin.yml?
Paper understands a second, newer descriptor called paper-plugin.yml. You will see it in some projects, including the clean-slate-paper-plugin template. The two are not interchangeable: a plugin uses one or the other.
plugin.yml | paper-plugin.yml | |
|---|---|---|
| Works on | Paper, and Spigot if you only use Bukkit API | Paper only |
| Commands in the file | Yes (commands:) | No, commands are registered in code |
| Dependencies | depend, softdepend, loadbefore | One dependencies: section with load order and required flags |
| Early setup before worlds | onLoad, load: STARTUP | A bootstrapper class |
| Best for | Almost every plugin, and everything in this guide | Advanced plugins that need the bootstrapper or loader |
Start with plugin.yml. When you are ready for more, Paper plugins: paper-plugin.yml, bootstrapper and loader explains the newer format.
Mistakes to avoid
- Forgetting to update
mainafter renaming a class or package. - Tabs in the indentation, often from copied text.
- Unquoted versions:
1.10becomes1.1. - A single value where a list belongs:
depend: Vaultinstead ofdepend: [Vault]. - Putting
plugin.ymlin the wrong folder. It belongs insrc/main/resources, not next to your Java files. - Wrong capital letters in
main, in dependency names, or in the keys themselves.
Fix the broken plugin.yml
A friend's plugin does not load. The main class is ShopSignsPlugin in the package com.example.pluginymlexercise, and the plugin is meant to be version 1.10. Find the six problems in this file:
1name: Shop Signs!2version: 1.103main: com.example.shopsigns.ShopSignsPlugin4api-version: 26.35description: Lets players make simple shop signs.6softdepend: LuckPerms7permissions:8 shopsigns.create:9 description: Create shop signs.10 default: trueHint 1
Check each required field against the rules on this page: allowed characters in names, quotes around versions, and the full class name.
Hint 2
Two problems are not in the first four lines. Look at the list field and at the indentation of the last line.
Show the solution
The six problems:
namecontains a space and!. UseShopSigns.version: 1.10is read as the number 1.1. Quote it:'1.10'.mainuses the wrong package. It must becom.example.pluginymlexercise.ShopSignsPlugin.api-versionshould be quoted:'26.3'. It happens to work unquoted, but only by luck.softdependmust be a list:[LuckPerms].defaultis indented by three spaces instead of four, so it does not line up withdescriptionand the YAML is invalid.
Where this file livesplugin-yml-exercisesrcmainresourcesplugin.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.
- plugin-yml-exercise/
- src/main/
- java/com/example/pluginymlexercise/Package com.example.pluginymlexercise
- ShopSignsPlugin.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
- java/com/example/pluginymlexercise/Package com.example.pluginymlexercise
- 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
- src/main/
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: ShopSigns2version: '1.10'3main: com.example.pluginymlexercise.ShopSignsPlugin4api-version: '26.3'5description: Lets players make simple shop signs.6softdepend: [LuckPerms]7permissions:8 shopsigns.create:9 description: Create shop signs.10 default: true- Quoted, so it stays 1.10.
- Matches the package and class in the Java file.
- A list with one entry.
- Lined up with
description, four spaces in.
Add a permission with children
Add a permission shopsigns.admin to the fixed file. It should default to operators and give its holders shopsigns.create as well.
Hint
Copy the shape of serverinfo.admin from the ServerInfo example on this page.
Show the solution
Add this under permissions:, at the same indentation as shopsigns.create:
1shopsigns.admin:2 description: Everything ShopSigns offers.3 default: op4 children:5 shopsigns.create: trueRecap
plugin.ymllives insrc/main/resourcesand ends up at the top of your jar.- Four fields are required:
name,version,mainandapi-version('26.3'). mainis the package plus the class name of yourJavaPluginclass, exactly.- YAML uses spaces for nesting (never tabs), two styles of lists, and quotes to stop type guessing.
dependmeans required,softdependmeans optional; both make Paper enable those plugins first.- A broken
plugin.ymlstops the plugin before any code runs; the console error names the field.
Quick quiz
Your main class is
BankPluginin the packagedev.jace.bank. What is the correctmainline?mainis the full class name: the package, a dot, and the class name. The class name alone is not enough, and it is never a file path.You write
version: 2.10without quotes. What version does Paper show?YAML reads2.10as a decimal number, which is the same as 2.1. Writing'2.10'in quotes keeps it as text.Your plugin uses PlaceholderAPI when it is installed but works fine without it. Which field fits?
softdependloads your plugin either way and enables PlaceholderAPI first when it is there.dependwould stop your plugin from loading on servers without it.Your plugin is not in
/pluginsand there is no "Enabling" line for it. What should you check first?A plugin that never reaches "Enabling" failed while Paper read its jar andplugin.yml. Listeners and permissions only matter after the plugin is enabled.What does
default: opmean on a permission?opgives the permission to operators by default. A permissions plugin such as LuckPerms can still grant it to other players or take it away.
Next steps
- plugin.yml Builder: make a valid file from a form.
- Events and listeners: make your plugin react to the game.
- Permissions: everything about permission nodes.