{"id":19508379,"url":"https://github.com/efekos/arn","last_synced_at":"2025-07-23T01:33:09.498Z","repository":{"id":240612875,"uuid":"800834881","full_name":"efekos/Arn","owner":"efekos","description":"Only command manager you will need.","archived":false,"fork":false,"pushed_at":"2024-05-23T05:28:38.000Z","size":356,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-05-23T05:40:01.333Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/efekos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-15T05:01:14.000Z","updated_at":"2024-05-30T06:23:38.042Z","dependencies_parsed_at":"2024-05-29T05:52:04.647Z","dependency_job_id":"e652661a-654f-4f45-b28e-6135a523c985","html_url":"https://github.com/efekos/Arn","commit_stats":null,"previous_names":["efekos/arn"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/efekos/Arn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efekos%2FArn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efekos%2FArn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efekos%2FArn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efekos%2FArn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/efekos","download_url":"https://codeload.github.com/efekos/Arn/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efekos%2FArn/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266602801,"owners_count":23954696,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-10T23:06:19.103Z","updated_at":"2025-07-23T01:33:09.468Z","avatar_url":"https://github.com/efekos.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](./assets/Arn.png)\n# Arn\n\n![](https://badgen.net/github/license/efekos/Arn)\n![](https://badgen.net/github/stars/efekos/Arn)\n![](https://badgen.net/github/release/efekos/Arn)\n![](https://badgen.net/github/releases/efekos/Arn)\n![](https://badgen.net/github/merged-prs/efekos/Arn)\n![](https://badgen.net/github/issues/efekos/Arn)\n[![Discord](https://badgen.net/discord/members/8PPgcmYNf4)](https://efekos.dev/discord)\n[![Patreon](https://badgen.net/static/Support/Patreon/orange?icon=patreon)](https://efekos.dev/patreon)\n[![Buy me a coffee](https://badgen.net/static/Support/Buy%20Me%20A%20Coffee/yellow?icon=buymeacoffee)](https://efekos.dev/bmac)\n\n\u003c!-- TOC --\u003e\n* [Arn](#arn)\n  * [Installation](#installation)\n  * [Usage](#usage)\n    * [Creating commands](#creating-commands)\n    * [Using parameter names as argument names](#using-parameter-names-as-argument-names)\n    * [Advanced literals](#advanced-literals)\n    * [Custom arguments](#custom-arguments)\n    * [Blocking access](#blocking-access)\n    * [Limits](#limits)\n    * [Configurations](#configurations)\n    * [Running](#running)\n    * [Quick access to sender properties](#quick-access-to-sender-properties)\n    * [Annotation exceptions](#annotation-exceptions)\n  * [License](#license)\n\u003c!-- TOC --\u003e\n\nArn is an annotation-based command library inspired by Spring boot that helps Minecraft plugins with creating, handling and\nregistering commands. This library uses Brigadier commands that Minecraft uses, so you can use most kinds of arguments\nyou see in the commands of the original game. Plus, you can turn any enumerator to a custom argument, all it takes is \ntwo annotations.\n\n## Installation\n\nAdd this repository if you don't have it in your `\u003crepositories\u003e` or `repositories`.\n\n````xml\n\u003crepository\u003e\n  \u003cid\u003eefekosdev\u003c/id\u003e\n  \u003curl\u003ehttps://efekos.dev/maven\u003c/url\u003e\n\u003c/repository\u003e\n````\n\n````gradle\nmaven { url 'https://efekos.dev/maven' }\n````\n\n| **Artifact** | **Platform** | **Latest Version** |\n|--------------|--------------|--------------------|\n| `arn-paper`  | PaperMC      | 0.4                |\n| `arn-spigot` | SpigotMC     | 0.4                |\n\nAdd this dependency. Check the table above to make sure you use the latest version and the correct dependency.\n\n````xml\n\u003cdependency\u003e\n  \u003cgroupId\u003edev.efekos.arn\u003c/groupId\u003e\n  \u003cartifactId\u003earn-paper\u003c/artifactId\u003e\n  \u003cversion\u003e0.4\u003c/version\u003e\n\u003c/dependency\u003e\n````\n\n````gradle\nimplementation 'dev.efekos.arn:arn-paper:0.4'\n````\n\n## Usage\n\nArn uses Java Reflection API to scan through your plugin, detect needed classes and use them. Because of this, you have\nto add a [`Container`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/Container.html) annotation to\n**every** class that must be scanned by Arn.\n\n### Creating commands\n\nLet's create a new class using the knowledge we know so far.\n\n````java\nimport dev.efekos.arn.common.annotation.Container;\n\n@Container\npublic class CommandClass {\n\n}\n\n````\n\nNormally, you need to either handle your command through events or create a [`Command`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/command/Command.html) class for it. But in Arn,\nall you have to do is add a method with such annotations.\n\n````java\nimport dev.efekos.arn.common.annotation.Command;\nimport org.bukkit.command.CommandSender;\n\n@Command(\"ping\") // command name\npublic int helloWorld(CommandSender sender /*get the sender*/) {\n    sender.sendMessage(\"Pong!\");\n    return 0;\n}\n\n````\n\nWhen scanned and registered, this method will be equivalent of command `/helloworld`, that takes no arguments and says\n\"Pong!\" back to the sender. Now you might be thinking about arguments. That is pretty easy.\n\n````java\nimport dev.efekos.arn.common.annotation.Command;\nimport dev.efekos.arn.common.annotation.CommandArgument;\nimport org.bukkit.command.CommandSender;\n\n@Command(\"hello\")\npublic int helloWorld(CommandSender sender, @CommandArgument String name /*string argument*/) {\n    sender.sendMessage(\"Hello \"+name+\"!\");\n    return 0;\n}\n````\n\nAll we have to do is add a parameter with\n[`CommandArgument`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/CommandArgument.html) annotation. This\nmethod is now the equivalent of `/helloworld \u003cname\u003e`, `\u003cname\u003e` being a `String` that can have whitespaces using quoted\nstrings. You can use following combinations of annotations and types by default (all of them requires\n[`CommandArgument`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/CommandArgument.html).):\n\n* [`Advancement`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/advancement/Advancement.html)\n* [`Attribute`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/attribute/Attribute.html)\n* [`@Block`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/Block.html) [`Material`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html)\n* [`BlockData`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/block/data/BlockData.html)\n* `Boolean`\n* `boolean`\n* [`World`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/World.html)\n* `Double`\n* `double`\n* [`PotionEffectType`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/potion/PotionEffectType.html)\n* [`Enchantment`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/enchantments/Enchantment.html)\n* [`Entity`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Entity.html)\n* `Float`\n* `float`\n* [`GameMode`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/GameMode.html)\n* `Integer`\n* `int`\n* [`@InventorySlot`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/NumberLimitations.html) `Integer`\n* [`@InventorySlot`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/NumberLimitations.html) `int`\n* [`@Item`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/Item.html) [`Material`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html)\n* [`ItemStack`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/ItemStack.html)\n* [`Location`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Location.html)\n* `Long`\n* `long`\n* [`Entity`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Entity.html)\\[]\n* [`Player`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Player.html)\\[]\n* [`Player`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Player.html)\n* `String`\n* [`BaseComponent`](https://javadoc.io/doc/net.md-5/bungeecord-chat/latest/net/md_5/bungee/api/chat/BaseComponent.html)\n* [`@Vector`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/Vector.html) [`Location`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Location.html)\n\nThese don't require a [`CommandArgument`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/CommandArgument.html)\nannotation.\n\n* [`BlockCommandSender`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/command/BlockCommandSender.html)\n* [`CommandSender`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/command/CommandSender.html)\n* [`ConsoleCommandSender`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/command/ConsoleCommandSender.html)\n* [`Player`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Player.html)\n\nBy default, name of an argument is same with name of the parameter. If you want, you can explicitly specify argument\nnames like this.\n\n````java\npublic int method(@CommandArgument(\"name\") String s);\n````\n\n### Using parameter names as argument names\n\nIf you don't specify argument names and let Arn use parameter names instead, you'll probably face a problem. Maven does\nnot compile applications with parameter names. In order to solve this problem, you can add small configuration to your\n`maven-compiler-plugin`. It is something like this:\n\n````xml\n\u003cplugin\u003e\n    \u003cartifactId\u003emaven-compiler-plugin\u003c/artifactId\u003e\n    \u003cconfiguration\u003e\n        \u003cparameters\u003etrue\u003c/parameters\u003e\n    \u003c/configuration\u003e\n    \u003c!-- ... --\u003e\n\u003c/plugin\u003e\n````\n\nI use Maven, so I don't know a solution for Gradle. It is probably something easy like it is in Maven, so you can fix it\nwith a bit of research.\n\n### Advanced literals\n\nI only showed you how to make base commands. There is more than base commands in Arn. If you want to use two or more\nliterals, you can simply separate them with `.` in your [`CommandArgument`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/CommandArgument.html)\nannotation. But in this way, arguments will be placed after all the literals. If you want to place literals between\narguments, you can follow this syntax: `[ab]:[0-9]+:[a-z]+`. First group of a letter determines will this literal be placed before\nor after the argument with the given index. Second group of a number is the index of an argument. Finally, last group of\na lowercase word is the actual literal. Let me explain how it works more with this graph:\n\n![Advanced literal placement explained](assets/command-explanation.png)\n\nAs you can see, the last literal 'makefloor' is placed after 0th argument. This is because the first letter is 'a' and\nthe index is `0`. If the letter was 'b', the literal would be placed after second literal 'stuff'. If the index was `1`,\nthe literal would be placed after the 1st argument.\n\n### Custom arguments\n\nIf you want to make a custom argument, you can, using Enum classes! All you have to do is annotate an enum class with both\n[`Container`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/Container.html) and [`CustomArgument`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/CustomArgument.html),\nand you'll be able to use that enum class as a command argument.\n\n````java\n// Rating.java\n\nimport dev.efekos.arn.common.annotation.Command;\nimport dev.efekos.arn.common.annotation.CommandArgument;\nimport dev.efekos.arn.common.annotation.Container;\nimport dev.efekos.arn.common.annotation.CustomArgument;\nimport org.bukkit.entity.Player;\n\n@Container\n@CustomArgument()\npublic enum Rating {\n    TRASH,\n    BAD,\n    MID,\n    GREAT,\n    GOAT\n}\n\n// Commands.java\n\n@Container\npublic class Commands {\n\n    @Command(\"rate\")\n    public int rate(@CommandArgument Rating rating, @CommandArgument String message, Player sender) {\n        player.sendMessage(\"Thanks for your rating!\");\n        return 0;\n    }\n    \n}\n````\n\n### Blocking access\n\nYou can block access by using a permission or annotations. All you have to do is add the permission node to the\n[`Command`](https://efekos.dev/javadoc/arn/0.3/dev/efekos/arn/annotation/Command.html) like this:\n\n````java\nimport dev.efekos.arn.common.annotation.Command;\nimport dev.efekos.arn.common.annotation.block.BlockCommandBlock;\nimport dev.efekos.arn.common.annotation.block.BlockConsole;\nimport dev.efekos.arn.common.annotation.block.BlockPlayer;\n\n@Command(value = \"this.is.command.name\", permission = \"methods.cmd.method\")\n@BlockPlayer // Blocks access to players\n@BlockCommandBlock // Blocks access to command blocks\n@BlockConsole // Blocks access to the console\npublic int method(/*...*/);\n````\n\n### Limits\n\nYou can apply [`NumberLimitations`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/NumberLimitations.html)\nto any command argument with a number type.\n\n````java\nimport dev.efekos.arn.common.annotation.Command;\nimport dev.efekos.arn.common.annotation.CommandArgument;\nimport dev.efekos.arn.common.annotation.block.BlockCommandBlock;\nimport dev.efekos.arn.common.annotation.modifier.NumberLimitations;\n\n@Command(\"settimeout\")\n@BlockCommandBlock\npublic int setTimeout(@CommandArgument @NumberLimitations(min = 0,max = 30) Integer argument);\n````\n\n### Configurations\n\nIf you want to go even more crazy, you can implement your own command parameter types. You have to make an implementation\nof [`CommandHandlerMethodArgumentResolver`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/resolver/CommandHandlerMethodArgumentResolver.html)\nfirst. If you want to add an argument to the command structure to resolver a parameter, you might also need to make an\nimplementation of a [`CommandArgumentResolver`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/resolver/CommandArgumentResolver.html).\nAfter that, simply make a [`Container`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/Container.html) that\nimplements [`ArnConfigurer`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/config/ArnConfigurer.html), and add your\nresolvers using that configurer.\n\n### Running\n\nAfter all of your command and configurations are done, call\n[`Arn`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/Arn.html)[`#run`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/Arn.html#run(java.lang.Class))\nfrom your plugin.\n\n````java\nimport dev.efekos.arn.common.Arn;\nimport dev.efekos.arn.common.base.ArnInstance;\nimport org.bukkit.plugin.java.JavaPlugin;\n\npublic class MyPlugin extends JavaPlugin {\n\n  @Override\n  public void onEnable() {\n    if(Arn.isAvailable()){\n        ArnInstance arn = Arn.getInstance();\n        arn.run(MyPlugin.class,this);\n    }\n  }\n\n}\n````\n\n### Quick access to sender properties\n\nThere is an annotation called [`FromSender`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/FromSender.html)\nthat lets you access properties of the command sender (such as name) without having to get it yourself. As of 0.2, these\nare the valid parameters you can use. Keep in mind that they all also need\n[`@FromSender`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/FromSender.html).\n\n| Available Sender Types                                                                       | Argument                                                                                                                                                                                                    | Description                                                                                                                                                          | Notes                                                                                                                                                                         |\n|----------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| ![](./assets/readme/player.svg) ![](./assets/readme/cb.svg)                                  | [`Location`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Location.html)                                                                                                                             | Returns location of the sender.                                                                                                                                      |                                                                                                                                                                               |\n| ![](./assets/readme/player.svg) ![](./assets/readme/cb.svg) ![](./assets/readme/console.svg) | [`@Name`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/Name.html) `String`                                                                                                | Returns name of the sender. Console sender will return `\"CONSOLE\"` and command blocks will return a string containing its locations, `\"[@:24:62:-113]\"` for example. | If the parameter name ends with `\"name\"` (ignoring case), [`@Name`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/Name.html) isn't required. |\n| ![](./assets/readme/player.svg)                                                              | [`ItemStack`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/ItemStack.html)                                                                                                                 | Returns the item player has in their main-hand slot.                                                                                                                 |                                                                                                                                                                               |                                                                                                                                                                             |\n| ![](./assets/readme/player.svg)                                                              | [`@OffHand`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/OffHand.html) [`ItemStack`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/ItemStack.html)       | Returns the item player has in their off-hand slot.                                                                                                                  |                                                                                                                                                                               |\n| ![](./assets/readme/player.svg)                                                              | [`@Helmet`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/Helmet.html) [`ItemStack`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/ItemStack.html)         | Returns the item player has in their helmet slot.                                                                                                                    |                                                                                                                                                                               |\n| ![](./assets/readme/player.svg)                                                              | [`@Chestplate`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/Chestplate.html) [`ItemStack`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/ItemStack.html) | Returns the item player has in their chestplate slot.                                                                                                                |                                                                                                                                                                               |\n| ![](./assets/readme/player.svg)                                                              | [`@Leggings`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/Leggings.html) [`ItemStack`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/ItemStack.html)     | Returns the item player has in their leggings slot.                                                                                                                  |                                                                                                                                                                               |\n| ![](./assets/readme/player.svg)                                                              | [`@Boots`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/Boots.html) [`ItemStack`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/ItemStack.html)           | Returns the item player has in their boots slot.                                                                                                                     |                                                                                                                                                                               |\n| ![](./assets/readme/player.svg)                                                              | [`@ExpLevel`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/ExpLevel.html) `Integer`                                                                                       | Returns player's experience level.                                                                                                                                   | Can be any of `Double`/`Integer`/`Float`, it will be casted accordingly.                                                                                                      |\n| ![](./assets/readme/player.svg)                                                              | [`@FoodLevel`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/FoodLevel.html) `Integer`                                                                                     | Returns player's food level.                                                                                                                                         | Can be any of `Double`/`Integer`/`Float`, it will be casted accordingly.                                                                                                      |\n| ![](./assets/readme/player.svg)                                                              | [`@Health`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/Health.html) `Double`                                                                                            | Returns player's health.                                                                                                                                             | Can be any of `Double`/`Integer`/`Float`, it will be casted accordingly.                                                                                                      |\n| ![](./assets/readme/player.svg)                                                              | [`@MaxHealth`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/MaxHealth.html) `Double`                                                                                      | Returns player's maximum health.                                                                                                                                     | Can be any of `Double`/`Integer`/`Float`, it will be casted accordingly.                                                                                                      |\n| ![](./assets/readme/player.svg)                                                              | [`@Experience`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/modifier/sender/Experience.html) `Float`                                                                                     | Returns player's experience points.                                                                                                                                  | Can be any of `Double`/`Integer`/`Float`, it will be casted accordingly.                                                                                                      |\n| ![](./assets/readme/player.svg)                                                              | `UUID`                                                                                                                                                                                                      | Returns UUID of the player.                                                                                                                                          |                                                                                                                                                                               |\n| ![](./assets/readme/player.svg)                                                              | [`Inventory`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/Inventory.html)                                                                                                                 | Returns inventory of the player.                                                                                                                                     |                                                                                                                                                                               |\n\nIf a [`@FromSender`](https://efekos.dev/javadoc/arn/0.3.1/dev/efekos/arn/annotation/FromSender.html)ed argument is not\navailable for the sender, it will return `null` instead.\n\n### Annotation exceptions\n\nWhen you make custom argument resolvers, your resolvers might have conflicts with some other resolvers. In order to\nprevent this, you can use annotation exceptions. When you add an annotation exception to a resolver, that resolver can't\nwork on parameters with that annotation, for example:\n\n````java\n\nimport dev.efekos.arn.common.exception.ExceptionMap;\nimport dev.efekos.arn.paper.face.PaperArnConfig;\nimport dev.efekos.arn.paper.face.PaperCmdResolver;\nimport dev.efekos.arn.paper.face.PaperHndResolver;\n\nimport java.util.List;\n\npublic class GreatConfig implements PaperArnConfig {\n\n  @Override\n  public void addHandlerMethodArgumentResolvers(List\u003cPaperHndResolver\u003e resolvers) {\n\n  }\n\n  @Override\n  public void addArgumentResolvers(List\u003cPaperCmdResolver\u003e resolvers) {\n\n  }\n\n  @Override\n  public void putArgumentResolverExceptions(ExceptionMap\u003cCommandArgumentResolver\u003e map) {\n    map.put(CmdStringArg.class, Greater.class); // now CmdStringArg won't be applicable for parameters with @Greater\n  }\n\n  @Override\n  public void putHandlerMethodArgumentResolverExceptions(ExceptionMap\u003cCommandHandlerMethodArgumentResolver\u003e map) {\n    map.put(HndStringArg.class, Greater.class); // This blocks HndStringArg the same way\n  }\n  \n}\n\n````\n\n## License\n\nThis repository is licensed under the [MIT License](https://github.com/efekos/Arn/blob/master/LICENSE).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fefekos%2Farn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fefekos%2Farn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fefekos%2Farn/lists"}