Skip to content

Abilities API

This page shows how to programmatically create and manage abilities for custom accessories.

Example 1: Creating a Buff Plugin

A complete plugin that creates a set of buff accessories:

import org.bg52.curiospaper.CuriosPaper;
import org.bg52.curiospaper.api.CuriosPaperAPI;
import org.bg52.curiospaper.data.AbilityData;
import org.bg52.curiospaper.data.ItemData;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.Arrays;

public class BuffAccessoryPlugin extends JavaPlugin {

    @Override
    public void onEnable() {
        CuriosPaperAPI api = CuriosPaper.getInstance().getCuriosPaperAPI();

        // --- Speed Ring ---
        createBuffItem(api, "speed_ring", "&b&lRing of Swiftness",
            "GOLD_NUGGET", "ring",
            AbilityData.EffectType.POTION_EFFECT, "SPEED", 0, 100,
            "&7Grants the wearer incredible speed.");

        // --- Health Amulet (+4 max health = 2 extra hearts) ---
        createBuffItem(api, "health_amulet", "&c&lAmulet of Vitality",
            "NAUTILUS_SHELL", "necklace",
            AbilityData.EffectType.PLAYER_MODIFIER, "GENERIC_MAX_HEALTH", 4, 0,
            "&7Grants 2 extra hearts.");

        // --- Attack Gloves ---
        createBuffItem(api, "attack_gloves", "&4&lGloves of Fury",
            "LEATHER", "hands",
            AbilityData.EffectType.PLAYER_MODIFIER, "GENERIC_ATTACK_DAMAGE", 3, 0,
            "&7+3 attack damage.");

        getLogger().info("Buff accessories registered!");
    }

    private void createBuffItem(CuriosPaperAPI api, String id, String name,
            String material, String slotType,
            AbilityData.EffectType effectType, String effectName,
            int amplifier, int duration, String description) {

        // Don't overwrite if already exists
        if (api.getItemData(id) != null) return;

        ItemData item = api.createItem(this, id);
        item.setDisplayName(name);
        item.setMaterial(material);
        item.setSlotType(slotType);
        item.setLore(Arrays.asList(description));

        // Create the ability
        AbilityData ability = new AbilityData();
        ability.setTrigger(AbilityData.Trigger.WHILE_EQUIPPED);
        ability.setEffectType(effectType);
        ability.setEffectName(effectName);
        ability.setAmplifier(amplifier);
        ability.setDuration(duration);

        item.getAbilities().put("main_buff", ability);
        api.saveItemData(id);
    }
}

Example 2: Multi-Ability Items

Items with multiple abilities triggered at different times:

import org.bg52.curiospaper.data.AbilityData;
import org.bg52.curiospaper.data.ItemData;

public void createWarriorBelt(CuriosPaperAPI api) {
    ItemData belt = api.createItem(this, "warrior_belt");
    belt.setDisplayName("&e&lWarrior's Belt");
    belt.setMaterial("LEATHER");
    belt.setSlotType("belt");
    belt.setLore(Arrays.asList(
        "&7A battle-worn belt of a legendary warrior.",
        "&7Grants strength on equip and speed while worn.",
        "&7Applies weakness when removed."
    ));

    // Ability 1: Strength II for 30 seconds on equip
    AbilityData equipStrength = new AbilityData();
    equipStrength.setTrigger(AbilityData.Trigger.EQUIP);
    equipStrength.setEffectType(AbilityData.EffectType.POTION_EFFECT);
    equipStrength.setEffectName("INCREASE_DAMAGE");
    equipStrength.setAmplifier(1); // Strength II
    equipStrength.setDuration(600); // 30 seconds
    belt.getAbilities().put("equip_strength", equipStrength);

    // Ability 2: Speed I while equipped (continuous)
    AbilityData passiveSpeed = new AbilityData();
    passiveSpeed.setTrigger(AbilityData.Trigger.WHILE_EQUIPPED);
    passiveSpeed.setEffectType(AbilityData.EffectType.POTION_EFFECT);
    passiveSpeed.setEffectName("SPEED");
    passiveSpeed.setAmplifier(0); // Speed I
    passiveSpeed.setDuration(100);
    belt.getAbilities().put("passive_speed", passiveSpeed);

    // Ability 3: Weakness I for 20 seconds on de-equip
    AbilityData deequipWeakness = new AbilityData();
    deequipWeakness.setTrigger(AbilityData.Trigger.DE_EQUIP);
    deequipWeakness.setEffectType(AbilityData.EffectType.POTION_EFFECT);
    deequipWeakness.setEffectName("WEAKNESS");
    deequipWeakness.setAmplifier(0);
    deequipWeakness.setDuration(400); // 20 seconds
    belt.getAbilities().put("deequip_weakness", deequipWeakness);

    api.saveItemData("warrior_belt");
}

Example 3: Stat Modifier Set

Create a full set of accessories that modify player attributes:

public void createStatSet(CuriosPaperAPI api) {
    // Ring: +2 Luck
    createModifier(api, "lucky_ring", "&a&lRing of Fortune",
        "GOLD_NUGGET", "ring", "GENERIC_LUCK", 2);

    // Necklace: +4 Armor
    createModifier(api, "iron_amulet", "&7&lIron Amulet",
        "IRON_NUGGET", "necklace", "GENERIC_ARMOR", 4);

    // Bracelet: +0.5 Knockback Resistance
    createModifier(api, "steady_bracelet", "&9&lSteady Bracelet",
        "CHAIN", "bracelet", "GENERIC_KNOCKBACK_RESISTANCE", 1);

    // Charm: +0.04 Movement Speed (~20% faster)
    createModifier(api, "swift_charm", "&b&lSwift Charm",
        "EMERALD", "charm", "GENERIC_MOVEMENT_SPEED", 1);
}

private void createModifier(CuriosPaperAPI api, String id, String name,
        String material, String slotType, String attribute, int amplifier) {

    if (api.getItemData(id) != null) return;

    ItemData item = api.createItem(this, id);
    item.setDisplayName(name);
    item.setMaterial(material);
    item.setSlotType(slotType);

    AbilityData modifier = new AbilityData();
    modifier.setTrigger(AbilityData.Trigger.WHILE_EQUIPPED);
    modifier.setEffectType(AbilityData.EffectType.PLAYER_MODIFIER);
    modifier.setEffectName(attribute);
    modifier.setAmplifier(amplifier);
    modifier.setDuration(0);

    item.getAbilities().put("modifier", modifier);
    api.saveItemData(id);
}

AbilityData Class Reference

Trigger Enum

Value Description
AbilityData.Trigger.EQUIP Fires once on equip
AbilityData.Trigger.DE_EQUIP Fires once on de-equip
AbilityData.Trigger.WHILE_EQUIPPED Fires continuously

EffectType Enum

Value Description
AbilityData.EffectType.POTION_EFFECT Bukkit PotionEffect
AbilityData.EffectType.PLAYER_MODIFIER Bukkit AttributeModifier

Methods

Method Type Description
getTrigger() / setTrigger(Trigger) Trigger When the ability activates
getEffectType() / setEffectType(EffectType) EffectType What kind of effect
getEffectName() / setEffectName(String) String PotionEffectType or Attribute name
getAmplifier() / setAmplifier(int) int Effect strength (0-based)
getDuration() / setDuration(int) int Duration in ticks
isValid() boolean Validates the ability data

Validation

AbilityData ability = new AbilityData();
ability.setTrigger(AbilityData.Trigger.WHILE_EQUIPPED);
ability.setEffectType(AbilityData.EffectType.POTION_EFFECT);
ability.setEffectName("SPEED");
ability.setAmplifier(0);
ability.setDuration(100);

if (ability.isValid()) {
    // Safe to add to item
    item.getAbilities().put("my_ability", ability);
} else {
    // Missing required fields — check trigger, effectType, effectName
}