Voxel Shop beta is live. Expect occasional bugs. Learn more
Premium equipment , set, ability, gems engine for folia and paper
What is IgniteEquipmentPro?
IgniteEquipmentPro is the premium successor to IgniteEquipmentEffects. It turns any Bukkit ItemStack into a fully programmable piece of equipment - passive effects, conditional gates, player-activated abilities, set bonuses, socketed gems, random rolls and item levelling - all driven by simple yaml files and reload-safe at runtime.
Every item runs through the same pipeline: PDC tag → scan → conditions → effects → triggers → abilities. There is no fragile name/lore matching, no per-event hardcoding, and no separate dependency plugin to install. Drop the jar in, restart, edit yaml. That is it.
The plugin is built 100% on IgniteAPI (shaded and relocated inside the jar), so it gets the same battle-tested config, scheduler, lifecycle, storage and ACF command stack as the rest of the Ignite Series.
Why "Pro"
How it works
Define - Drop a yaml file in plugins/IgniteEquipmentPro/items/ with id, item, conditions, effects, triggers, abilities
Tag - /eqpro give hands out a PDC-tagged item that survives renames and item movement
Activate - The runtime scans worn / held items every tick, re-evaluates conditions and applies / removes effects automatically
Trigger - 26 trigger types fire on Bukkit events with their own cooldown, gate and effect listPersist - Charges, cooldowns and item XP are saved per-player in the configured storage backend
Condition engine - 18 condition types
Conditions support both a shorthand AND form and full boolean trees. Every condition can be reused inside trigger and ability gates.
World & environment
WORLD · BIOME · TIME · WG_REGION
Player state
HEALTH_BELOW · HEALTH_ABOVE · XP_LEVEL · GAMEMODE · IN_COMBAT · PERMISSION
Movement & posture
SNEAKING · SPRINTING · FLYING · ON_GROUND · BLOCKING · IN_LIQUID
Items & integrations
HOLDING · PLACEHOLDER (PAPI compare)
Boolean nodes
AND · OR · NOT · ALWAYS · NEVER
conditions:
type: OR
children:
- type: AND
children:
- type: WORLD
worlds: [ world ]
- type: HEALTH_BELOW
value: 30
- type: NOT
child:
type: SNEAKING
value: true
Effect kinds - 13 built-in
Trigger types - 26 built-in
Each trigger has its own cooldown, gate condition, charge cost and effect list.
Lifecycle
ON_EQUIP · ON_UNEQUIP · PASSIVE
Interaction
ON_INTERACT · ON_RIGHT_CLICK · ON_LEFT_CLICK · ON_SHIFT_RIGHT_CLICK · ON_DOUBLE_RIGHT_CLICK
Combat
ON_KILL_PLAYER · ON_KILL_MOB · ON_DAMAGE_DEALT · ON_DAMAGE_TAKEN · ON_PROJECTILE_HIT · ON_SHOOT_BOW
World
ON_BLOCK_BREAK · ON_BLOCK_PLACE · ON_FISH · ON_EAT
Movement
ON_SNEAK_START · ON_SNEAK_END · ON_SPRINT_START · ON_SPRINT_END · ON_JUMP · ON_FALL · ON_RESPAWN
Reactive
ON_HEALTH_BELOW (hysteresis-debounced - fires on the falling edge) · ON_COMBO (rapid melee hit chain inside a 1.5s window)
Abilities
Player-activated effect bundles. Each ability passes through AbilityExecutor which checks - in this exact order - permission, gate, cooldown, charges and Vault money. Charges and money are deducted only on success.
Set bonuses
plugins/IgniteEquipmentPro/sets/.yml declares a set, its member ids and tier-bonus thresholds (2 / 4 / 6 pieces). Bonuses stack: wearing 4 pieces activates both the 2-piece and 4-piece bonuses.
id: "speedster"
display-name: "Speedster"
equipment-ids:
- "SPEED_BOOTS"
- "SPEED_LEGGINGS"
- "SPEED_CHESTPLATE"
- "SPEED_HELMET"
tier-bonuses:
2:
effects: [ "SPEED:0" ]
4:
effects:
- "JUMP_BOOST:1"
- { type: AURA, particle: CLOUD, radius: 1.0, points: 8 }
console-commands:
- "say {player} has assembled the full Speedster set!"
Sockets & gems
Gems are their own yaml files. Each socket on an equipment can hold one gem id and the gem's effects are layered on top of the equipment's passive effects at apply time. Socket lists are stored per item instance on the PDC, so two copies of the same equipment can have totally different gems.
Random rolls
Define a weighted pool on an equipment, then hand the item out with /eqpro give-random . The runtime picks the configured number of rolls weighted by weight, stores them on the item PDC and applies each rolled effect on top of the passive effect set.
roll-table:
rolls: 2
pool:
- { weight: 50, label: "Speed I", effect: "SPEED:1" }
- { weight: 30, label: "Jump II", effect: "JUMP_BOOST:1" }
- { weight: 20, label: "+4 HP", effect: { type: ATTRIBUTE, attribute: MAX_HEALTH, amount: 4.0 } }
Item XP & Level Rewards
Every equipment can level up. XP is tracked per (player, equipment) in the configured storage backend, the curve is floor(sqrt(xp / 100)) (override the formula in ItemLevels), and every level threshold can grant permanent unlocks AND fire a one-shot milestone - all driven by the same yaml the rest of the plugin already speaks.
Step 1 - earn XP via the per-event reward block:
xp-rewards:
on-kill-player: 8
on-kill-mob: 1
on-damage-dealt: 0
on-block-break: 0
on-fish: 0
Step 2 - reward levels with permanent unlocks and one-shot milestones:
level-rewards:
5:
label: "+1 Attack Damage"
unlocks: # permanent while equipped + level >= 5
- type: ATTRIBUTE
attribute: ATTACK_DAMAGE
amount: 1.0
operation: ADD_NUMBER
id: "berserker_axe_lv5_dmg"
on-level-up: # one-shot when player crosses Lv 5
title: "BLOODED"
subtitle: "Level 5 - +1 Attack Damage"
effects:
- "STRENGTH:0:30s"
- type: PARTICLE
particle: DUST_COLOR_TRANSITION
count: 40
10:
label: "Fire Aspect + soulflame aura"
unlocks:
- "FIRE_ASPECT:0"
- type: AURA
particle: SOUL_FIRE_FLAME
radius: 1.0
points: 8
on-level-up:
title: "REAVER"
announce: "{player} ascends with {name}"
effects: [ "STRENGTH:1:60s" ]
console-commands:
- "give {player} netherite_scrap 1"
Unlock anatomy - both unlocks and on-level-up.effects reuse the standard effect list. That means every effect kind the plugin supports already works as a level reward - potions, attributes, auras, trails, heals, damage, sounds, titles, action bars, commands.
Step 3 - watch progress in the tooltip. The lore template supports inline + block placeholders that the renderer expands on every XP gain, on join, and after every pickup:
Example rendered lore:
⚜ Level 6 · 240/400 XP (60%)
▸ ████████████ (filled / dark gray bar)
⚜ XP per Action
▸ Player kill · +8 XP
▸ Mob kill · +1 XP
⚜ Milestones
✓ Lv 5 · +1 Attack Damage
✓ Lv 10 · Fire Aspect + soulflame aura
✗ Lv 20 · Bloodsong - +2 ATK & passive Strength
Live updates - no PAPI required. The lore is rewritten on the actual ItemStack via ItemPresentation.apply():
PAPI bonus (optional, for HUDs and scoreboards): %eqpro_xp_% and %eqpro_level_% are still exposed - use them in sidebars, holograms, action bars or chat formats outside the tooltip.
Why it works without bloat:
Storage backends
Same interface, same persisted fields (cooldowns, charges, item XP, bindings). Pick the backend that fits your network.
Async writes. SQL and Mongo upserts go through Async.fireAndForget so the main thread never blocks on JDBC. Reads stay consistent thanks to a synchronous in-memory cache. If a remote backend fails to initialize the plugin falls back to an in-memory repository and logs a single warning, so the rest of the plugin always boots cleanly.
PlaceholderAPI
Identifier: eqpro. Placeholders are cached for 500 ms.
Integrations
Every optional integration is soft-loaded. Missing plugins are detected at runtime, a single line is logged and the plugin keeps running unchanged.
Bundled defaults - 11 items, 3 sets, 5 gems
The plugin's data folder is pre-populated on first boot so admins have something to spawn and inspect immediately. Every file is editable yaml - keep, rebalance, or delete to taste.
Items
Sets
Gems
In-game editor
/eqpro editor opens a paginated browser. Click any equipment to inspect its full configuration - Info, Effects, Conditions, Triggers, Abilities. Every edit is written back to the source yaml and logged to audit.log.
Restructuring full condition trees still goes through yaml + /eqpro reload - reload is hot, no restart needed.
Commands
Alias: /eqpro · /igniteequipmentpro · /iep
Permissions
API for other plugins
IgniteEquipmentPro plugin = IgniteEquipmentPro.getInstance();
plugin.getEquipmentRepository().findById("SPEED_BOOTS");
plugin.getEquipmentService().activeEquipmentIds(player);
plugin.getTriggerDispatcher().fire(player, TriggerType.ON_INTERACT);
UUID id = player.getUniqueId();
plugin.getPlayerStateRepository().charges(id, "charge:SPEED_BOOTS");
plugin.getPlayerStateRepository().itemXp(id, "SPEED_BOOTS");Equipment, Trigger, Ability, Condition and ItemEffect are immutable data classes - safe to read from any thread.
EquipmentService.update and TriggerDispatcher.fire must run on the main thread because they touch Bukkit state.
Requirements
Standalone JAR. IgniteAPI, ACF, bStats and the JDBC / Mongo drivers are all shaded and relocated inside the plugin jar. No separate IgniteAPI plugin, no library loader setup, no manual jar install on the server.
Perfect for
Why choose IgniteEquipmentPro?
Most equipment plugins are still stuck on name + lore matching, hardcoded condition lists and one fixed effect type. IgniteEquipmentPro is built differently: PDC-tagged items, a real condition tree, 13 stackable effect kinds, 26 trigger types and an ability executor with proper gating - all driven by yaml, all hot-reloadable, all exposed through a stable API.
Define. Tag. Activate. Trigger. Persist.