# For Developers

For assistance, please [visit the support discord](https://discord.gg/arcaneplugins-752310043214479462).

***

Direct Links to Sonatype and the Maven Repositories\
<https://central.sonatype.com/artifact/io.github.arcaneplugins/levelledmobs-plugin>\
<https://mvnrepository.com/artifact/io.github.arcaneplugins/levelledmobs-plugin>

{% tabs %}
{% tab title="Maven" %}

#### Maven

1] Add the Repository:

```javascript
<repository>
    <id>Central Sonatype</id>
    <url>https://central.sonatype.com/</url>
</repository>
```

2] Add the LevelledMobs dependency:

```javascript
<dependency>
    <groupId>io.github.arcaneplugins</groupId>
    <artifactId>LevelledMobs-plugin</artifactId>
    <version>X.X.X</version>
</dependency>
```

\*\* Make sure to replace `X.X.X` with the latest version of LevelledMobs, [as referenced here](https://mvnrepository.com/artifact/io.github.arcaneplugins/levelledmobs-plugin).
{% endtab %}

{% tab title="Gradle" %}

#### Gradle

1] Add the Repository:

```javascript
repositories {
    maven("https://central.sonatype.com/")
}
```

2] Add the LevelledMobs dependency:

```javascript
implementation("io.github.arcaneplugins:levelledmobs-plugin:X.X.X")
```

\*\* Make sure to replace `X.X.X` with the latest version of LevelledMobs, [as referenced here](https://mvnrepository.com/artifact/io.github.arcaneplugins/levelledmobs-plugin).
{% endtab %}
{% endtabs %}

### Access the LevelledMobs processing

* The [LevelInterface class](https://github.com/ArcanePlugins/LevelledMobs/blob/master/levelledmobs-plugin/src/main/kotlin/io/github/arcaneplugins/levelledmobs/LevelInterface.kt) provides core information;
* [Multiple events](https://github.com/ArcanePlugins/LevelledMobs/tree/master/levelledmobs-plugin/src/main/kotlin/io/github/arcaneplugins/levelledmobs/events) which can be listened to and modified with ease;
* A populated [Javadocs](https://arcaneplugins.github.io/LevelledMobs/) with basic documentation;

***

### Obtaining the Level of a Mob without using the API

Mob levels are stored in the Persistent Data Container (PDC). You can obtain the level without using the LevelledMobs API by using code similar this:

{% tabs %}
{% tab title="Java" %}
**Simplified Solution**

{% code overflow="wrap" %}

```java
    public int getMobLevel(LivingEntity livingEntity){
        Plugin levelledMobsPlugin = Bukkit.getPluginManager().getPlugin("LevelledMobs");
        if (levelledMobsPlugin == null) return 0;
        NamespacedKey levelKey = new NamespacedKey(levelledMobsPlugin, "level");
        return Objects.requireNonNullElse(
                livingEntity.getPersistentDataContainer().get(levelKey, PersistentDataType.INTEGER),
                0
        );
    }    
```

{% endcode %}

**Elegant Solution**

{% code overflow="wrap" %}

```java
public class LevelledMobsManager {
    private final Boolean levelledMobsIsInstalled;
    private NamespacedKey key;

    public LevelledMobsManager(){
        Plugin levelledMobsPlugin = Bukkit.getPluginManager().getPlugin("LevelledMobs");
        levelledMobsIsInstalled = levelledMobsPlugin != null && levelledMobsPlugin.isEnabled();

        if (levelledMobsIsInstalled){
            key = new NamespacedKey(levelledMobsPlugin, "level");
        }
    }

    public boolean hasLevelledMobsInstalled(){
        return levelledMobsIsInstalled != null && levelledMobsIsInstalled;
    }

    public int getLevelledMobsMobLevel(Entity entity){
        if (!hasLevelledMobsInstalled()) return 0;

        Integer mobLevel = entity.getPersistentDataContainer().get(key, PersistentDataType.INTEGER);
        return Objects.requireNonNullElse(mobLevel, 0);
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="Kotlin" %}
**Simplified Solution**

```kotlin
    fun getMobLevel(livingEntity: LivingEntity) : Int{
        val levelledMobs = Bukkit.getPluginManager().getPlugin("LevelledMobs") ?: return 0
        val levelKey = NamespacedKey(levelledMobs, "level")
        return livingEntity.persistentDataContainer.get(levelKey, PersistentDataType.INTEGER) ?: 0
    }
```

**Elegant Solution**

```kotlin
class LevelledMobsManager {
    private val levelledMobsIsInstalled: Boolean?
    private var key: NamespacedKey? = null

    init {
        val levelledMobsPlugin = Bukkit.getPluginManager().getPlugin("LevelledMobs")
        levelledMobsIsInstalled = levelledMobsPlugin != null && levelledMobsPlugin.isEnabled

        if (levelledMobsIsInstalled) {
            key = NamespacedKey(levelledMobsPlugin!!, "level")
        }
    }

    fun hasLevelledMobsInstalled(): Boolean {
        return levelledMobsIsInstalled != null && levelledMobsIsInstalled
    }

    fun getLevelledMobsMobLevel(entity: Entity): Int {
        if (!hasLevelledMobsInstalled()) return 0

        return entity.persistentDataContainer.get(key!!, PersistentDataType.INTEGER) ?: 0
    }
}
```

{% endtab %}
{% endtabs %}

***

### Integrating into CustomDrops Sample

Below is a sample bit of code which uses the CustomDrops system of LevelledMobs via the API

```javascript
    private void testCustomDrops(){
        ItemStack itemStack = new ItemStack(Material.NETHERITE_SWORD);
        ItemMeta meta = itemStack.getItemMeta();
        assert meta != null;
        meta.setDisplayName("Cool Netherite Sword");
        meta.setLore(List.of("Created via API"));
        itemStack.setItemMeta(meta);

        // https://arcaneplugins.github.io/LevelledMobs/3.9.3/me/lokka30/levelledmobs/LevelledMobs.html
        LevelledMobs lm = LevelledMobs.getInstance();

        // https://arcaneplugins.github.io/LevelledMobs/3.9.3/me/lokka30/levelledmobs/customdrops/CustomDropItem.html
        CustomDropItem customDropItem = new CustomDropItem(lm); // must pass instance to LevelledMobs main class
        customDropItem.setItemStack(itemStack);

        // these options correspond to many of the item specific options shown here:
        // https://github.com/ArcanePlugins/LevelledMobs/wiki/Documentation---customdrops.yml
        customDropItem.chance = 1.0F;
        customDropItem.equippedSpawnChance = 1.0F;

        // https://arcaneplugins.github.io/LevelledMobs/3.9.3/me/lokka30/levelledmobs/customdrops/CustomDropInstance.html
        final CustomDropInstance customDropInstance = new CustomDropInstance(EntityType.ZOMBIE);
        customDropInstance.customItems.add(customDropItem);
        // mob specific options can be set on customDropInstance

        lm.customDropsHandler.externalCustomDrops.addCustomDrop(customDropInstance);
        // the drop is now registered just as if it were in customdrops.yml

        main.getLogger().info("Added a new drop for zombie");
    }
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://arcaneplugins.gitbook.io/levelledmobs-the-ultimate-mob-levelling-solution/levelledmobs-v4.0/for-developers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
