Skip to content

Developing with LevelledMobs

Penal Buffalo edited this page Jun 25, 2024 · 8 revisions
This page was last updated for LevelledMobs 3.1.0 b475

Maven Dependency

Maven

Add the repository.

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

Add the LevelledMobs dependency.

<dependency>
    <groupId>io.github.arcaneplugins</groupId>
    <artifactId>LevelledMobs-plugin</artifactId>
    <version>4.0.2</version>
</dependency>

Gradle

Add the repository.

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

Add the LevelledMobs dependency.

implementation("io.github.arcaneplugins:levelledmobs-plugin:4.0.2")

Replace REPLACE ME with the latest version (not including build number!) of LevelledMobs, e.g. 3.1.0.

Obtaining The Level Of A Mob Without Using 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:

Simple Solution

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
        );
    }

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

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);
    }
}

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
    }
}

Accessing LevelledMobs directly

We offer the LevelInterface class to interact directly with LevelledMobs.

Events

We also offer a bunch of events which you can listen to and modify.

You can prevent mobs from being levelled, run stuff after they have been levelled, and so on.

Javadocs

You may view the javadocs we have compiled so far.

These show our code documentation which we are gradually improving.

Integrating Into Custom Drops

If you want to integrate your plugin directly into LM's custom drop system, we have an API for it. Sample code is below.

    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");
    }

If you need assistance in using LevelledMobs with your plugin, please contact us! :)

Clone this wiki locally