Documentation

ItemsCore

Build fully custom items, armor sets and talismans for your server - with no Java and no recompiling. You design everything by clicking through an in-game editor: pick a trigger, add ready-made methods, fill in the blanks. There is no syntax to learn, and an AI can build items for you too. Works on Minecraft 1.8 - 26.2.

Minecraft 1.8 - 26.2 No coding required AI-ready Free demo server
CUSTOM ACTIONS
A visual action builder. Chain methods, operators and nested values - no syntax to memorise.
PARTICLE SYSTEM
Circles, helixes, beams and equation-driven projectiles built in.
STATS & EVENTS
A custom stat system, talisman items and a custom events system built on 50+ server events.
AI-READY
A local MCP server lets any AI read this exact API and build items for you.

It also ships dupe detection, multi-server data sync and a player-inventory moderation tool for staff.

Installation

  1. Drop ItemsCore.jar into your server's plugins/ folder.
  2. Start the server once. The config and an items/ folder are generated in plugins/ItemsCore/.
  3. Run /itemeditor to open the item browser, or /itemeditor <name> to edit a specific item.

Optional integrations are detected automatically if installed: PlaceholderAPI, Vault and AuraSkills.

iThe old web-based item editor is no longer supported. Everything is done in the in-game /itemeditor GUI now.

Try it free

You don't have to buy first. Launch your own hosted demo server straight from the browser - the full plugin with the official addons, no download and nothing to configure. Build items, test abilities and play with them in-game, then come back as many times as you like.

  • The real plugin - not a cut-down trial. Everything on this page works on the demo.
  • Instant - click once, get a join address, you're in. No account, no setup.
  • AI-ready - the demo includes a file manager that works with the AI helper, so you can have an item written for you and import it live.
Start one from the demo page. When you're ready, buy once for lifetime access to this version and every future update.

Editor basics

Open the editor with /itemeditor (or /itemeditor <name> to edit one). Everything below is set from a single item screen. Colours use & codes, and on supporting versions hex with &#rrggbb.

OptionWhat it does
Item MaterialHold the item you want and click the button - it copies your held item.
IdentifierThe internal id used in config files and commands. No spaces. Also stored on the item with a generated UUID for dupe detection.
Fancy NameThe coloured display name shown in-game.
LoreEdit a line, right-click to remove it, shift-click for the next/new line, shift-right-click for the previous.
EnchantmentsOpens a GUI of every enchantment; click one and enter a level. Click an added enchant to remove it.
FlagsToggle Bukkit item flags on and off (e.g. hide attributes).
Custom Model DataFor resource-pack models.

Click type & heads

The click type controls when click / right-click actions are allowed to run:

Click typeRuns when the player clicks…
BLOCKonly a block
AIRonly air (empty space)
BOTHeither - the default

This is set per action, so one item can have a right-click ability that only triggers in the air and a separate block interaction.

Skull owner

When the item is a player head, set Skull Owner to a username to use that player's skin as the texture.

Custom model data

Set Custom Model Data to a number to point the item at a model in your resource pack. Combined with a base material this is how most servers render fully custom item textures while keeping a normal Minecraft item underneath. The value is just an integer your pack maps to a model.

Actions

An action is behaviour attached to a trigger - for example "when the player right-clicks". You build it visually in three steps:

  1. Pick an action or event. Choose the trigger (left-click, right-click, etc). One item can have many actions. You can also click Create new custom event and build your own from 50+ supported server events, each with its player variables.
  2. Add methods. Click Click to add a method and pick from the categories. Right-click an empty method slot to load a saved template, right-click a built method to save it as a template, and right-click a category to set a method from it directly.
  3. Fill parameters. Simple types (text, numbers, booleans) are typed in directly. Right-click a parameter to open the methods menu and use another method's result as the value. Middle-click switches a parameter to chest mode for list/array values.

Methods run top to bottom. Between two methods you can drop an operator to build maths or conditions; leave it on None for the normal "run one after another" case. See the Triggers reference for what each trigger exposes, and Methods for everything you can call.

The method icon tells you what it does: command block = an action (returns nothing), paper = returns a value you can pass on, grey dye = an inherited Java method that is rarely useful.

Keep going from a result

Some values only exist one step past a method. The player's height is not on the player, it is on the player's location. In the methods menu, right-click any method that returns something and the menu reopens on that result, so you can carry on from there.

Picking Get Location, then Add, then Get Y builds the whole thing as one step, with no code:

player.getLocation().add(0, 2, 0).getY()

Chains go as deep as you like, and a method in the middle keeps its own values: open the step's parameters and each earlier link with values of its own gets a row there, so nothing in a chain is ever stuck.

Name a value and reuse it

When several steps need the same value, click Set a variable, give it a name, and build its value like any other action. From then on that name appears in the methods menu next to The Player and the rest, with the right type, so you can pass it around or keep going from it exactly like a built-in.

This replaces the old workaround of saving a value to a player variable purely to read it back a line later.

iA named value lasts for that one run of the action. It carries into a doIf or loopThrough body, and into delayed and repeating ones like core.runCodeLater and core.loop, which freeze what they can see when they are scheduled. To keep a value between triggers or across a restart, use core.setPlayerVariable or core.setItemVariable instead.

Finding the right method

Long method lists open as areas first - Combat, Movement, Messaging, Items, Blocks and so on - so you pick what you are trying to do before you see any names. Bukkit's own methods, which have no categories, group into Read something, Change something and Show or send. Show everything gives you the full alphabetical list, and searching goes straight to results.

Methods read as plain words in the menu (Get Location rather than getLocation), with the real name shown underneath so it still matches what you would search for or write in an import file.

Crafting recipes

Give a custom item a shaped crafting recipe so players can craft it at a normal crafting table. Open the recipe GUI from the item editor and place ingredients in the 3x3 grid exactly as they should be laid out.

  • Vanilla ingredients - any normal Minecraft material.
  • Custom ingredients - another ItemsCore item can be required in a slot, matched by its identity, not just its material.
  • Amounts - a slot can require more than one of an ingredient. Crafting consumes the exact amount you set, and the result only appears when enough is present.

Custom items now also show up correctly in the vanilla in-game recipe book - with their real name, lore and model - and are unlocked for players automatically.

An AI can author recipes too. The clean item JSON has a recipe field (a 9-slot grid), so a helper-built item can ship with its recipe ready to import.

Stats

Stats are named numbers you define once and then attach to items. Create and manage them with /stats (permission itemscore.stats). In an item's stats GUI you pick from your created stats and set the value for that specific item.

Read a stat inside an action with core.getItemStatValue(item, "strength") or a player's combined stat with core.getPlayerStatValue(player, "strength"), and expose stats through PlaceholderAPI.

Item types

An item's type decides when its stats and actions apply. Cycle it on the item screen - no code needed:

TypeEffects apply while…
Normalthe item is held in hand
Talismanthe item sits anywhere in the inventory - or in the player's Accessory Bag, an optional feature you turn on with /ic accessorybag - perfect for passive bonuses that should not cost a hotbar slot. Each talisman counts only once, however many copies a player holds
Off-handthe item is in the off-hand slot
Armorthe item is worn as armor
Equipmentthe item is worn in an EquipmentCore slot (rings, necklaces and other custom gear)

The type also drives how reforges, the wardrobe and equipment slots treat the item, so a stat or ability only counts when the item is actually in use.

Drops & loot

Every custom item has a Drops & Loot button in the item editor. It splits into two menus - Drop Effects and Randomized Loot - so a dropped copy can look special and the item can appear on its own in world loot.

Drop Effects

Style a copy of the item lying on the ground. Each is a simple toggle and all are off by default:

  • Glow - the dropped item glows in a colour you pick. Needs MC 1.9+.
  • Name tag - show a floating name above the drop.
  • Invulnerable - survives fire, lava, explosions and cacti. Needs MC 1.10+.
  • No despawn - the drop never disappears.
  • No merge - stays a separate ground stack instead of merging into other item piles.
  • No gravity - the drop floats in place. Needs MC 1.10+.

Randomized Loot

Let an item spawn on its own in naturally generated chests - dungeons, mineshafts, villages, desert and jungle temples, nether fortresses, bastions, end cities, buried treasure, shipwrecks, ancient cities, trial chambers and more. Set a percentage chance, a min/max amount, a per-chest cap, and pick which container types (or leave them all selected for every chest). Needs Minecraft 1.16+.

Both menus are fully configurable in-game with steppers and toggles - no config files or code.

How abilities work

You never write or read code. An ability is a stack of method tiles you assemble in the editor, and they run top to bottom when the trigger fires. To heal the player and message them, you add two tiles - heal and send message - and fill in their boxes. That is the whole ability.

Tiles come from categories like messaging, movement, combat, world edits, sounds, particles, projectiles, timing and player variables (plus economy with Vault). When a tile needs a value - a number, some text, or the player - you type it in, or right-click the box to drop in another tile's result instead.

Conditions, loops and maths

The "logic" is handled by tiles too, so there is still nothing to type:

  • Conditions - doIf and doIfElse run their inner tiles only when a check passes. The check is just another tile, like chanceOf (a percentage roll), isHealthBelowPercent or isWearingFullSet.
  • Delays & repeats - runCodeLater waits before running its tiles, and loopThrough repeats them over a list, such as every nearby entity.
  • Maths - drop an operator between two tiles, or nest add / multiply / min tiles, to build a number without writing a formula.
Because every ability is built from these tiles, an item an AI writes for you opens in the editor the same way - each step is a tile you can click and change.

Events

Events are the same idea as actions, but separated out because they react to things happening to the player rather than a direct click. Each exposes its own variables, and you can stop the event with core.cancelEvent(event).

EventFires whenKey variables
DamageEventthe item is used to attack an entityattacker victim cause damage
PlayerDamageEventthe holder/wearer takes damageplayer cause damage
ProjectileHitEntityEventa shootProjectile projectile hits an entityshooter victim lastLocation
ProjectileHitBlockEventthat projectile hits a blockshooter lastLocation
ArmorEquipEventthe armor is equippedplayer item
ArmorUnEquipEventthe armor is unequippedplayer item
PlayerMoveEventthe player moves holding/wearing the itemplayer item

Beyond these, the Create new custom event button lets you react to any of 50+ Bukkit events directly, each with the player it resolves and the raw event object.

Cooldowns

Each action can have its own per-player cooldown. Open the cooldown clock in the action's GUI and type any duration - a number with a unit, like 5s, 90s, 2m or 1h (a bare number means seconds). While the cooldown is active that action will not run for that player.

On-cooldown message

You can also send the player a message when they try to use the action too soon. Shift-click the cooldown clock to set the message; shift-right-click clears it. The message supports & colours and these time-left placeholders:

PlaceholderBecomes
%remaining_seconds%whole seconds left, rounded up
%remaining_minutes%whole minutes left, rounded up
%remaining_hours%whole hours left, rounded up
%remaining%formatted time, e.g. 1m 30s
%remaining_millis%milliseconds left

For example, a message of &cWait %remaining_seconds%s before using this again. shows the player a red countdown.

iThe message only does anything when a cooldown is set on that action. An AI helper can set both the cooldown and its message for you.

Examples

Each of these is a short stack of tiles on a trigger. You add the tiles, fill in the boxes, and you're done - no typing.

Fire burst - on left-click

  • a filledCircle of FLAME particles at the player's location
  • playSound - the blaze-shoot sound
  • splashDamage - hurt every entity in a small radius around them

Homing particle bolt - on right-click

  • shootProjectile made of coloured dust, fired from the player's eyes
  • give the item a Projectile Hits Entity action so it does something when the bolt lands

25% chance to strike lightning - on hit

  • a doIf tile with chanceOf (25) dropped in as its check
  • inside it, a summonLightning tile at the victim's location
iWant one built for you? Describe it to the AI helper - it assembles these same tiles and hands you an item you can import and then tweak by hand.

Official addons

ItemsCore is built around an open addon API, and these official addons plug straight in. Each one adds its own menus to the editor - there is nothing to script. Browse and install them in-game with /ic install addon browse, or grab them from their pages:

AddonWhat it adds
ReforgesCoreCustom reforges and reforge stones that add extra stats to items - with a manage menu, random and targeted rolls, and an advanced anvil to apply them.
EquipmentCoreExtra wearable equipment slots - rings, necklaces and more - whose stats and abilities only apply while the item is worn. Fully configurable slot menu.
SkinsCoreCosmetic skins, runes, dyes and custom heads you apply to items, with worn animations and particle effects.
WardrobeCoreSave and toggle full armor sets from a wardrobe menu - dupe-proof, with per-set permission locks.
ProfileCoreRight-click or /profile to open a player's profile menu - live armor, held item, off-hand, equipment and a textured head with {stats} and PlaceholderAPI lore. Fully configurable layout and buttons.
iWant to build your own? The Developer Documentation covers the addon API - custom methods, attributes, listeners, actions, auto-generated config screens and the cross-addon injection bus.

Integrations

ItemsCore also detects these third-party plugins automatically when they are installed:

PluginWhat it unlocks
VaultConnect to the server economy - core.balance, core.deposit, core.withdraw.
PlaceholderAPIParse placeholders in strings with core.parsePlaceholder(player, text), and expose item stats (see Placeholders).
AuraSkillsSkills, mana and stats - ItemsCore can push its own per-player stat totals straight into it.

Placeholders

With PlaceholderAPI installed, ItemsCore registers the itemscore expansion so you can show item stats in scoreboards, holograms, tab lists and anywhere else placeholders are parsed.

PlaceholderReturns
%itemscore_statValue_<stat>_<item>%the raw stat value for that item, e.g. 50
%itemscore_statFancyName_<stat>%the stat's display name
%itemscore_statFancyValue_<stat>_<item>%the formatted value (the stat's value template with the number filled in)
%itemscore_statFancyString_<stat>_<item>%the display name and formatted value together

Replace <stat> with the stat name and <item> with the item identifier, for example %itemscore_statValue_damage_magic_sword%.

!These placeholders are split on _, so avoid underscores inside stat and item names if you plan to use them in placeholders.

AI helper

You can let an AI build and edit ItemsCore items for you, with no coding. To keep it in one place and always up to date, the whole thing - a one-paste setup prompt, the local MCP server, and the full guide - lives in the helper repo: github.com/Core-Pluginss/ItemsCore-Helper. Open it, copy the prompt into your AI, and it sets itself up and builds your item.

The AI reads this exact API, validates what it writes, and hands you a .import file. Importing it rebuilds a normal, GUI-editable item - so anything the AI makes you can still tweak by hand in the editor.

Commands

Run /ic (or its full alias /itemscore) on its own to see the command list. Run a subcommand on its own, like /ic database, to see just that group's commands. Every standalone command also works as an /ic subcommand (e.g. /ic stats, /ic playerinventory).

CommandDescription
/itemeditor [name]Open the item browser, or edit a specific item.
/icShow the full command list.
/ic menuOpen the items menu. Left-click an item to edit it, right-click to give / set recipe / delete, or use the button to create a brand new item. (/ic gui still works.)
/ic editor [item]Open the item editor. Same as /itemeditor.
/ic templatesManage saved action templates: rename, delete and search.
/ic reload [items|stats] [name]Reload from disk. No arguments reloads everything; a category (items or stats) reloads all of it; adding a name reloads just that one item or stat. Returns a success / error list and retries previously-failed items.
/ic export <item>Export an item to clean JSON (exports/).
/ic import <file>Import a clean JSON from imports/ as a live, GUI-editable item.
/ic adopt <item>Make a code-only item editable in the GUI.
/ic install <item|template|stat> <url>Download an item (.item/.import), template (.yml/.template) or stat from a direct link. Jars are refused on this path.
/ic install addon browseBrowse and install supported addons (PowerScrolls, PlaceholderAPI, Vault, AuraSkills) at their latest version, or /ic install addon <name>.
/ic delete <item> confirmDelete a custom item (removes it from memory, its file, and the database if enabled).
/ic exportapiWrite the machine-readable API manifest (itemscore-api.json).
/ic databaseMulti-server sync tools (see below): status, migrate, restore.
/ic librariesShow the status of the runtime-downloaded MongoDB / Redis drivers. /ic libraries verify downloads or repairs them.
/ic animationsBuild named particle animations entirely in the GUI - a categorized shape picker, stacked layers, colors and a live "Test on me". Play one from any item action with particles.playAnimation(player, "name", ticks), with no animation code. Saved to animations/, and reusable inside a rune skin.
/statsCreate and manage custom stats. Stats also live in stats/stats.yml as plain YAML and apply with /ic reload stats.
/addonsOpen a menu of the ItemsCore addons loaded on the server, and says so clearly when none are loaded.
/playerinventory <player>Open a player's inventory for moderation.
/toggledupealerts  /tdaToggle the dupe-detection alerts staff receive in chat when a duplicated item is found.
/accessorybag  /accessoriesOpen your Accessory Bag: a personal bag that holds Talisman items and keeps them fully active, exactly as if they were in your inventory. Its size is permission-based (itemscore.accessorybag.slots.cap.<n>) and it is disabled by default - enable and size it under /ic accessorybag. /accessorybag <player> opens another player's bag.
A broken item no longer disables the whole plugin - only that item is skipped, and /ic reload shows you exactly what failed and why.
Every menu you can lay out in-game (equipment, profile, wardrobe, reforges, the anvil, the recipe book) lets you set an icon with Use item in your hand, which keeps that item's own data - a custom head texture, a dyed color, a custom model - not just its material. So a menu button can be a real textured head. Browsing for a plain material instead clears it.

Permissions

PermissionGrants
itemscore.admingui/ic / /itemscore and every subcommand
itemscore.itemeditor/itemeditor
itemscore.stats/stats
itemscore.addons/addons
itemscore.playerinventory/playerinventory
itemscore.toggledupealerts/toggledupealerts (/tda)
itemscore.accessorybag.selfOpen your own Accessory Bag with /accessorybag (default: everyone)
itemscore.accessorybag.othersOpen another player's Accessory Bag with /accessorybag <player> (default: op)
itemscore.accessorybag.slots.cap.<n>Set a player's Accessory Bag size to <n> slots - the highest node a player has wins

Multi-server sync

Running a network? ItemsCore can keep data consistent across servers using a shared MongoDB database, with optional Redis for instant propagation. Each category is configured independently in config.yml under database - keep it in files (the default) or make it database-wide:

CategoryWhat syncs
itemsyour custom items
global-variablesserver-wide variables
player-variablesper-player variables
configthe whole config (except the database section, which stays local)
  • Set your MongoDB URI and database name, then enable the categories you want - or flip enable-all to turn on every category at once.
  • The database stays fully off until you enable at least one category, so single-server setups are unaffected.
  • Redis is optional. With it, changes propagate instantly; without it, servers poll on an interval. ItemsCore always falls back to files if the database is unreachable - a bad connection never takes the plugin down.

Migrating

CommandDescription
/ic database statusShow the connection state and which categories are database-wide.
/ic database migrate confirmPush your current file data up into the database.
/ic database restore confirmPull the database data back down into files.
idb works as a shorthand for database in all of these.

Triggers

A trigger is when an action fires. Each one exposes the variables listed here.

TriggerFires whenVariables
leftActionA player left-clicks while holding the item.playeritemevent
leftSActionA player sneaks and left-clicks while holding the item.playeritemevent
rightActionA player right-clicks while holding the item.playeritemevent
rightSActionA player sneaks and right-clicks while holding the item.playeritemevent
shiftActionA player starts sneaking while holding or wearing the item.playeritemevent
dropActionA player drops the item (the drop is cancelled).playeritemevent
onItemEquipA player selects the item in their hotbar.playeritemevent
armorEquipEventThe item (armor) is put on.playeritemevent
armorUnEquipEventThe item (armor) is taken off.playeritemevent
swapActionA player swaps hands (F key) with the item.playeritemevent
shootActionA player shoots a projectile while holding the item.shooteritemevent
pickupActionA player picks the item up off the ground.playeritemevent
arrowLandActionAn arrow shot while holding the item lands.shooteritemarrowlandLocationevent
onConsumeActionA player finishes eating or drinking the item.playeritemevent
damageEventYou hit something while holding this item (the on-attack trigger). Use the variable 'attacker' for yourself (the holder) and 'victim' for what you hit - there is NO 'player' variable here.attackervictimitemcausedamageevent
projectileHitEntityEventA custom projectile from this item hits an entity.shootervictimitemlastLocationevent
projectileHitBlockEventA custom projectile from this item hits a block.shooteritemlastLocationevent
playerMoveEventA player moves while holding or wearing the item.playeritemevent
playerDamageEventThe holder or wearer of this item takes damage. 'player' is the one being hurt; 'cause' / 'causeName' is the damage cause and 'damage' is the amount.playeritemcausecauseNamedamageevent
intervalActionRuns again and again on a timer (set the period in ticks, 20 = 1s) for as long as the item is held or worn. Great for auras, passive particles, or keeping a potion effect topped up.playeritemevent

Variables

Values you can use directly inside an action.

VariableTypeAvailable
coreActionCore$CoreAlways available.
particlesActionCore$ParticlesAlways available.
valuesActionCore$CustomValuesAlways available.
apiItemsCoreAPIAlways available.
itemItemAlways available (the custom item this action belongs to).
eventEventAlways available (the Bukkit event; cancel with core.cancelEvent(event)).
playerPlayerMost triggers.
shooterLivingEntityshootAction, arrowLandAction, projectile hit events.
victimEntityprojectileHitEntityEvent.
arrowEntityarrowLandAction.
landLocationLocationarrowLandAction.
lastLocationLocationprojectile hit events.

Methods

Everything you can call in an action, generated directly from the plugin so it always matches your version. Pick a binding, browse by category, or search.

all235core163particles60values2api10

coreMain toolbox. Most actions live here: damage, teleport, sounds, projectiles, variables, loops, conditionals.

Blocks17
core.breakBlock(Block block)action

Breaks a block naturally, dropping its normal loot.

core.breakBlock(core.getBlockAtByLocation(player.getLocation()))
core.breakBlockWithItem(Block block, Item item)action

Breaks a block naturally as if mined with the given custom item, dropping its loot.

core.breakBlockWithItem(core.getBlockAtByLocation(player.getLocation()), item)
core.changeBlock(Block block, String material)action

Changes a block into the material with the given name.

core.changeBlock(core.getBlockAtByLocation(player.getLocation()), "GOLD_BLOCK")
core.changeBlockByMaterial(Block block, Material material)action

Changes a block into the given material.

core.changeBlockByMaterial(core.getBlockAtByLocation(player.getLocation()), core.getMaterial("GOLD_BLOCK"))
core.getBlockAt(World world, int x, int y, int z)returns Block

Gets the block at the given x, y, z coordinates in a world.

core.getBlockAt(player.getWorld(), 100, 64, -200)
core.getBlockAtByLocation(Location location)returns Block

Gets the block at a given location.

core.getBlockAtByLocation(player.getLocation())
core.getBlocksInRadius(Location startLoc, int x, int y, int z)returns Block[]

Returns all blocks in a box around a location, reaching the given distance on each axis.

core.getBlocksInRadius(player.getLocation(), 3, 3, 3)
core.getType(Block block)returns Material

Returns the material (type) of a block.

core.getType(core.getBlockAtByLocation(player.getLocation()))
core.groundSmash(Location center, int radius, double power)action

Erupts the floor: turns the solid blocks one layer under the center into real falling blocks in a square of the given radius, launching them upward with the given power so they arc up and drop back into place. Works on every version. Great to call at a projectile's hit location.

core.groundSmash(player.getLocation(), 2, 0.6)
core.removeBlock(Block block)action

Turns a block into air, making it disappear without drops.

core.removeBlock(core.getBlockAtByLocation(player.getLocation()))
core.removeBlocks(Block[] blocks)action

Removes a whole list of blocks at once, turning them all to air.

core.removeBlocks(core.getBlocksInRadius(player.getLocation(), 3, 3, 3))
core.throwBlocks(Entity source, int radius, int depth, double forward, double up, double spread, String onLand)action

Block animation: rips the solid blocks in a square (radius) and depth (layers) under the source out of the ground and hurls them as real falling blocks forward in the direction the source faces, with an upward and a random spread component. The blocks vanish where they land instead of placing. Pass onLand script code (with landLocation, and player when the source is a player, available) to run an effect at each landing spot, or an empty string for none.

core.throwBlocks(player, 1, 2, 1.6, 0.6, 0.3, "core.splashDamageAtLocation(landLocation, 6, 3, 3, 3, player);")
core.throwIsland(Entity source, int radius, int depth, double forward, double up, String onLand)action

Block animation (entity-relative): copies the solid blocks in a square (radius) and depth (layers) under the entity and lobs that whole patch as one moving island of real falling blocks in the direction the entity faces (forward) with an upward push (up), then it falls back down under gravity. The ground stays intact. Runs the onLand script once at the landing spot (landLocation, and player when the source is a player, are available). Keep forward and up small for a slow lob. For throws not tied to a player position use the location overload throwIsland(location, ...) or throwIslandOf(...).

core.throwIsland(player, 1, 2, 0.5, 0.45, "core.splashDamageAtLocation(landLocation, 8, 4, 3, 4, player);")
core.throwIsland(Location center, int radius, int depth, double vx, double vy, double vz, String onLand)action

Block animation (free): copies the solid blocks in a square (radius) and depth (layers) at and below the given center location and lobs that patch as one moving island of real falling blocks with the exact world velocity (vx, vy, vz), then it falls under gravity. Not tied to any player or facing, so the center and direction are entirely yours. The original ground stays intact. Runs onLand once at the landing spot (landLocation, and player if it is in scope, are available). If the center is mid-air with no blocks below it nothing is thrown - use throwIslandOf to build the island from a chosen material instead.

core.throwIsland(target.getLocation(), 1, 1, 0.0, 0.6, -0.4, "core.splashDamageAtLocation(landLocation, 6, 3, 3, 3, player);")
core.throwIslandOf(Location center, String material, int radius, int depth, double vx, double vy, double vz, String onLand)action

Block animation (built from a material): spawns a square (radius) and depth (layers) island made of the given block material at the center location (no terrain needed, so it works in mid-air or anywhere) and lobs it as one moving group of real falling blocks with the world velocity (vx, vy, vz), then it falls under gravity. Runs onLand once at the landing spot (landLocation, and player if it is in scope, are available). Unknown materials fall back to STONE.

core.throwIslandOf(player.getLocation(), "MAGMA_BLOCK", 1, 1, 0.6, 0.5, 0.0, "core.splashDamageAtLocation(landLocation, 7, 3, 3, 3, player);")
core.veinMine(BlockBreakEvent event, Item item, int maxBlocks, int maxBox)returns int

Vein-mines straight from a block break event, shattering the rest of the connected vein around the block that was just broken. Same as veinMine on a block but takes the event so you can call it directly inside a block break handler.

core.veinMine(event, item, 64, 8)
core.veinMine(Block start, Item item, int maxBlocks, int maxBox)returns int

Breaks the whole connected vein of blocks around a block you just mined, as if each one was mined with the given item so it drops its loot. Only blocks that share the start block's material are taken, the start block itself is left to whatever broke it, and the search stops at maxBlocks blocks or once the vein spans maxBox blocks across in any direction. Returns how many extra blocks were broken.

core.veinMine(event.getBlock(), item, 64, 8)
Combat12
core.countNearbyLiving(Player player, double x, double y, double z)returns int

Counts the living entities (mobs and players, not yourself) in the x, y, z box around the player. Combine with isAtLeast for a scaling condition.

core.isAtLeast(core.countNearbyLiving(player, 8, 8, 8), 3)
core.damage(Entity v, double v1)action

Deals the given amount of damage to a living entity (half a heart = 1).

core.damage(victim, 6)
core.damageWithAttacker(Entity v, double v1, Entity v2)action

Damages a living entity and credits the damage to an attacker, so kills are attributed correctly.

core.damageWithAttacker(victim, 6, player)
core.hasNearbyLiving(Player player, double x, double y, double z)returns boolean

True when at least one living entity (mob or player, not yourself) is in the x, y, z box around the player. Use it to check for a target before an ability with no code.

core.doIf(core.hasNearbyLiving(player, 10, 10, 10), "...")
core.heal(LivingEntity player, double amount)action

Heals a living entity by the given amount, capped at its max health (half a heart = 1). Works on the player, a victim, or any mob.

core.heal(player, 4)
core.knockback(Entity entity, Location from, double multiplier)action

Knocks an entity away from a location, with extra strength set by the multiplier.

core.knockback(victim, player.getLocation(), 2)
core.knockbackNearbyLiving(Player player, double x, double y, double z, double strength)action

Knocks back every living entity in the x, y, z box around the player, away from the player, at the given strength. Skips the player.

core.knockbackNearbyLiving(player, 4, 3, 4, 1.2)
core.lightningNearbyLiving(Player player, double x, double y, double z)action

Strikes every living entity in the x, y, z box around the player with lightning. Skips the player.

core.lightningNearbyLiving(player, 8, 5, 8)
core.pullNearbyLiving(Player player, double x, double y, double z, double strength)action

Pulls every living entity in the x, y, z box around the player toward the player at the given strength. Skips the player. Great for a black-hole or vacuum ability with no looping code.

core.pullNearbyLiving(player, 7, 4, 7, 0.9)
core.setHealth(LivingEntity player, double health)action

Sets a living entity's health to an exact amount (half a heart = 1). Works on the player, a victim, or any mob.

core.setHealth(player, 20)
core.splashDamage(LivingEntity player, double damage, double x, double y, double z)action

Damages every entity near the given entity (except itself) within the given x, y, z range. The center can be the player, a victim, or any mob.

core.splashDamage(player, 6, 3, 3, 3)
core.splashDamageAtLocation(Location center, double damage, double x, double y, double z, Entity attacker)action

Deals splash damage to every living entity within the given x, y, z box around a location, crediting the attacker. Built for throwBlocks landing callbacks using landLocation.

core.splashDamageAtLocation(landLocation, 6, 3, 3, 3, player)
Economy3
core.balance(Player player)returns double

Returns a player's money balance (requires the Vault plugin).

core.balance(player)
core.deposit(Player player, double amount)returns boolean

Adds money to a player's balance and returns whether it succeeded (requires the Vault plugin).

core.deposit(player, 100)
core.withdraw(Player player, double amount)returns boolean

Removes money from a player's balance and returns whether it succeeded (requires the Vault plugin).

core.withdraw(player, 100)
Effects1
core.giveEffect(LivingEntity player, String effect, int duration, int amplifier, boolean ambient, boolean particles)action

Gives a living entity a potion effect for a duration (in ticks) at the given strength level. Works on the player, a victim, or any mob.

core.giveEffect(player, "SPEED", 200, 1, false, true)
Entities7
core.getEntityById(World world, int id)returns Entity

Finds an entity in a world by its numeric entity id, or nothing if not found.

core.getEntityById(player.getWorld(), 1234)
core.getEntityByUUID(World world, String uuid)returns Entity

Finds an entity in a world by its UUID text, or nothing if not found.

core.getEntityByUUID(player.getWorld(), "069a79f4-44e9-4726-a5be-fca90e38aaf5")
core.getEyeLocation(LivingEntity player)returns Location

Returns the location of a living entity's eyes (their head, where they are looking from).

core.getEyeLocation(player)
core.getNearbyEntities(Entity player, double v, double v1, double v2)returns List

Returns all entities near an entity (player, victim, or any mob) within the given x, y, z distances.

core.getNearbyEntities(player, 5, 5, 5)
core.getNearbyLivingEntities(Entity player, double v, double v1, double v2)returns List

Returns only the LIVING entities near an entity (players and mobs) within the given x, y, z distances. Skips dropped items, arrows, xp orbs and other non-living entities, so area effects only hit real targets.

core.getNearbyLivingEntities(player, 5, 5, 5)
core.killEntity(Entity entity)action

Removes an entity from the world (kills it without drops).

core.killEntity(victim)
core.summonEntity(World world, String type, double x, double y, double z)returns String

Spawns an entity of the given type at the x, y, z position and returns its UUID as text.

core.summonEntity(player.getWorld(), "ZOMBIE", 100, 65, -200)
Items40
core.addFireworkEffect(Player player, String type, int r, int g, int b)action

Adds a colored firework effect to a held firework rocket or firework star. type is BALL, BALL_LARGE, STAR, BURST or CREEPER and the burst takes the given RGB color. Does nothing if the held item is not a firework.

core.addFireworkEffect(player, "BALL_LARGE", 255, 0, 0)
core.addItemVariable(Player player, String key, double amount)returns double

Adds an amount to a numeric value stored on the held item (counting from 0 if it was never set) and returns the new total. Perfect for upgrade progress like blocks mined or kills.

core.addItemVariable(player, "blocks_broken", 1)
core.addPotionEffect(Player player, String type, int durationTicks, int amplifier)action

Adds a potion effect to a held potion, splash/lingering potion or tipped arrow. type is an effect name like SPEED or STRENGTH, duration is in ticks (20 = 1s), amplifier 0 = level I. Does nothing if the held item has no potion data.

core.addPotionEffect(player, "SPEED", 200, 1)
core.clearInventory(Player player)action

Empties a player's entire inventory.

core.clearInventory(player)
core.dropItem(ItemStack item, Location location)action

Drops an item on the ground at a location.

core.dropItem(core.getItemStack(item), player.getLocation())
core.dropItemByMaterial(Material material, Location location)action

Drops the given material on the ground at a location.

core.dropItemByMaterial(core.getMaterial("DIAMOND"), player.getLocation())
core.getBoots(Player player)returns ItemStack

Returns the boots a player is wearing.

core.getBoots(player)
core.getChestplate(Player player)returns ItemStack

Returns the chestplate a player is wearing.

core.getChestplate(player)
core.getHelmet(Player player)returns ItemStack

Returns the helmet a player is wearing.

core.getHelmet(player)
core.getItemBySlot(Player player, int slot)returns ItemStack

Returns the item in a specific inventory slot of a player.

core.getItemBySlot(player, 0)
core.getItemCooldownRemaining(Player player)returns int

Returns how many ticks of vanilla cooldown are left on the item that triggered this ability (20 ticks = 1 second), or 0 if it is ready.

core.getItemCooldownRemaining(player)
core.getItemStack(Item item)returns ItemStack

Builds the actual in-game ItemStack for one of your custom items.

core.getItemStack(item)
core.getItemStatValue(Item item, String statName)returns int

Returns the value of one of a custom item's stats by name, or 0 if the item does not have it.

core.getItemStatValue(item, "damage")
core.getItemVariable(Player player, String key)returns String

Reads a value stored on the player's held item with setItemVariable. Returns nothing if the item has no such value.

core.getItemVariable(player, "level")
core.getItemVariableNumber(Player player, String key)returns double

Reads a value stored on the held item as a number (0 if it was never set or is not a number). Use it to do math with item variables like a kill or soul counter.

core.getItemVariableNumber(player, "souls")
core.getItemVariableOrDefault(Player player, String key, Object def)returns String

Reads a value stored on the held item, or returns the given default if it was never set.

core.getItemVariableOrDefault(player, "level", 1)
core.getLeggings(Player player)returns ItemStack

Returns the leggings a player is wearing.

core.getLeggings(player)
core.getMaterial(String materialName)returns Material

Looks up a Minecraft material (block or item type) by its name.

core.getMaterial("DIAMOND_SWORD")
core.giveCustomItem(Player player, String id, int amount)action

Gives the player a fresh copy of a custom ItemsCore item by its id, amount times. Each copy is brand new and unique. Use it to hand out rewards from a voucher or crate.

core.giveCustomItem(player, "magic_sword", 1)
core.giveItem(Player player, Material material)action

Gives a player one of the given material as an item.

core.giveItem(player, core.getMaterial("DIAMOND"))
core.hasId(ItemStack stack, String id)returns boolean

Checks whether an item is a custom ItemsCore item with the given id.

core.hasId(player.getItemInHand(), "magic_sword")
core.hasItemCooldown(Player player)returns boolean

Returns true while the item that triggered this ability (held, or the worn armour piece) is still on a vanilla cooldown from setItemCooldown. Use it to block an action until the cooldown ends.

core.doIf(core.not(core.hasItemCooldown(player)), { steps: [ { call: core.heal, args: [player, 4] } ] })
core.isItemVariableAtLeast(Player player, String key, double amount)returns boolean

True when a numeric value stored on the held item is at least the given amount. Reads with getItemVariableNumber. Use it for a charge or soul counter condition with no code.

core.doIf(core.isItemVariableAtLeast(player, "souls", 1), "...")
core.isItemVariableAtMost(Player player, String key, double amount)returns boolean

True when a numeric value stored on the held item is at most the given amount. The mirror of isItemVariableAtLeast, for an empty/low counter condition.

core.doIf(core.isItemVariableAtMost(player, "souls", 0), "...")
core.isTalisman(Item item)returns boolean

Checks whether a custom item is a talisman (a passive item kept in the inventory).

core.isTalisman(item)
core.isWearingFullSet(Player player, String idPrefix)returns boolean

True when the player is wearing all four armour pieces of a set, matched by id prefix (e.g. "spirit" matches spirit_helmet, spirit_chestplate, spirit_leggings, spirit_boots). Perfect for a full-set bonus condition with no code.

core.doIf(core.isWearingFullSet(player, "spirit"), "...")
core.morphHeldItem(Player player, String material)action

Changes how the player's held item LOOKS by swapping its material, while it stays the exact same custom item (same id, lore and behavior) - it is now Morphed. The original material is remembered so unmorphHeldItem can restore it.

core.morphHeldItem(player, "MAGMA_BLOCK")
core.newPlayerHead(String playerName)returns ItemStack

Creates a new player head item showing the given player's skin.

core.newPlayerHead(player.getName())
core.playerHead(String playerName, ItemStack itemStack)returns ItemStack

Sets an existing player-head item to show the given player's skin.

core.playerHead(player.getName(), core.getItemBySlot(player, 0))
core.refreshItemLore(Player player)action

Redraws the held item's lore from its template, filling in placeholders like {var_level} with the values stored on that item. Call it after changing an item variable so the lore updates live. Write {var_yourKey} in the item's lore in the editor.

core.refreshItemLore(player)
core.removeHeldItem(Player player)action

Removes one of the item the player is currently holding from their hand.

core.removeHeldItem(player)
core.setItemCooldown(Player player, double seconds)action

Puts a real vanilla cooldown on the item that triggered this ability (the held item, or the worn armour piece for an armour ability) for the given number of seconds. Held items grey out with the sweeping overlay, exactly like an ender pearl; worn armour cannot show the overlay, so gate armour abilities with the action's own cooldown field instead. Needs Minecraft 1.11 or newer.

core.setItemCooldown(player, 3)
core.setItemVariable(Player player, String key, Object value)returns ItemStack

Stores a value on the player's held item itself (not the player). The value travels with that exact item even when it is moved, dropped or traded. Use it for per item state like an upgrade level or a kill counter. Returns the updated item.

core.setItemVariable(player, "level", 1)
core.setLeatherColor(Player player, int r, int g, int b)action

Dyes the held leather armor piece the given RGB color (each 0-255). Does nothing if the held item is not leather armor. Updates the look live, like a morph.

core.setLeatherColor(player, 255, 0, 0)
core.setLeatherColorHex(Player player, String hex)action

Dyes the held leather armor piece from a hex color like #ff0000. Does nothing if the held item is not leather armor.

core.setLeatherColorHex(player, "#ff0000")
core.skullOwner(String owner)returns ItemStack

Creates a player-head item showing the skin of the given player name.

core.skullOwner(player.getName())
core.skullTexture(String base64)returns ItemStack

Creates a player-head item from a base64 skin texture value (the kind sites like minecraft-heads give you).

core.skullTexture("eyJ0ZXh0dXJlcyI6ey4uLn19")
core.skullTextureSigned(String base64, String signature)returns ItemStack

Creates a player-head item from a base64 skin texture and its Mojang signature, for verified skins that need both.

core.skullTextureSigned("eyJ0ZXh0dXJlcyI6ey4uLn19", "<signature>")
core.subtractItemVariable(Player player, String key, double amount)returns double

Subtracts an amount from a numeric value stored on the held item and returns the new total. The mirror of addItemVariable, for spending a counter.

core.subtractItemVariable(player, "souls", 10)
core.unmorphHeldItem(Player player)action

Restores a morphed held item back to the original material it had before morphHeldItem. Does nothing if the item was never morphed.

core.unmorphHeldItem(player)
Logic17
core.and(boolean a, boolean b)returns boolean

True only when both conditions are true. Use it to combine two checks without writing code.

core.doIf(core.and(core.isStandingStill(player), core.isHealthBelowPercent(player, 0.5)), "...")
core.cancelEvent(Cancellable e)action

Cancels the current event so the normal action (like the block break or damage) does not happen.

core.cancelEvent(event)
core.chanceOf(double chance)returns boolean

Returns true with the given percent chance (0-100). Great for random ability procs.

core.doIf(core.chanceOf(25), "core.summonLightningByLocation(player.getLocation())")
core.doIf(boolean condition, String action)action

Runs a piece of script code only if the condition is true.

core.doIf(core.chanceOf(25), "core.heal(player, 4)")
core.doIfElse(boolean condition, String action, String elseAction)action

Runs one piece of script code if the condition is true, otherwise runs the other piece.

core.doIfElse(core.chanceOf(50), "core.heal(player, 4)", "core.damage(player, 4)")
core.isAtLeast(double a, double b)returns boolean

True when the first number is at least (greater than or equal to) the second.

core.doIf(core.isAtLeast(souls, 1), "...")
core.isAtMost(double a, double b)returns boolean

True when the first number is at most (less than or equal to) the second.

core.doIf(core.isAtMost(souls, 0), "...")
core.isEqual(double a, double b)returns boolean

True when two numbers are equal.

core.doIf(core.isEqual(level, 10), "...")
core.isGreater(double a, double b)returns boolean

True when the first number is greater than the second. Use it as a doIf condition instead of writing raw code.

core.doIf(core.isGreater(souls, 5), "...")
core.isLess(double a, double b)returns boolean

True when the first number is less than the second.

core.doIf(core.isLess(distance, 3), "...")
core.not(boolean value)returns boolean

Flips a true/false value. Use it to run something when a condition is NOT met.

core.doIf(core.not(core.hasNearbyLiving(player, 10, 10, 10)), "...")
core.or(boolean a, boolean b)returns boolean

True when either condition is true.

core.doIf(core.or(core.chanceOf(20), core.isAtLeast(souls, 10)), "...")
core.randomFromList(Object list)returns Object

Picks one random entry from a comma separated list (or a real list) and returns it. Roll a random reward, message or command with it.

core.giveCustomItem(player, core.randomFromList("sword,shield,bow"), 1)
core.randomInt(int min, int max)returns int

Returns a random whole number between min and max, both included.

core.randomInt(1, 6)
core.runCode(String code)action

Runs a piece of script code right now.

core.runCode("core.heal(player, 4)")
core.runCodeLater(String code, int ticks)action

Runs a piece of script code after a delay measured in ticks (20 ticks = 1 second).

core.runCodeLater("core.heal(player, 4)", 40)
core.runRunnableLater(BukkitRunnable runnable, int ticks)action

Runs an already-built runnable (from core.createRunnable) after a delay measured in ticks (20 ticks = 1 second). Prefer this over runCodeLater so the runnable is compiled once instead of evaluating a code string at runtime.

core.runRunnableLater(core.createRunnable("core.heal(player, 4)"), 40)
Loops5
core.loop(String action, int totalTimes, int period)action

Repeatedly runs a piece of script code a set number of times, waiting the given ticks between each run (-1 times means forever). The current loop number is available as tIndex.

core.loop("core.damage(victim, 1)", 5, 20)
core.loopThrough(String action, Object[] array, int period)action

Runs a piece of script code once for each item in an array, with the current item available as currentArrayObject.

core.loopThrough("core.damage(currentArrayObject, 2)", core.getNearbyEntities(player, 5, 5, 5).toArray(), 5)
core.runUntil(String code, String conditionCode, int period)action

Keeps running a piece of script code every few ticks while a condition stays true.

core.runUntil("core.damage(victim, 1)", "victim.getHealth() > 5", 20)
core.toArray(Collection collection)returns Object[]

Turns a list (like getNearbyLivingEntities) into an array so you can pass it straight to loopThrough, with no .toArray() code.

core.loopThrough(body, core.toArray(core.getNearbyLivingEntities(player, 6, 4, 6)), 1)
core.waitUntil(String code, String conditionCode, int period, int safe)action

Waits until a condition becomes true, then runs a piece of script code (the safe value limits how long it waits).

core.waitUntil("core.heal(player, 4)", "player.isOnGround()", 20, 100)
Math7
core.add(double a, double b)returns double

Adds two numbers. Use it to build a value out of nested calls, like a base plus a scaling part.

core.add(4, core.multiply(souls, 0.5))
core.clamp(double value, double low, double high)returns double

Keeps a number between a low and a high bound (returns the bound if it is outside the range).

core.clamp(value, 0, 10)
core.divide(double a, double b)returns double

Divides the first number by the second (returns 0 if dividing by zero).

core.divide(distance, 2)
core.max(double a, double b)returns double

Returns the larger of two numbers.

core.max(value, 1)
core.min(double a, double b)returns double

Returns the smaller of two numbers. Use it to cap a value, e.g. spend at most a limit of a counter.

core.min(core.getItemVariableNumber(player, "souls"), 10)
core.multiply(double a, double b)returns double

Multiplies two numbers. Use it to scale an amount, like souls times a damage-per-soul value.

core.multiply(souls, 0.5)
core.subtract(double a, double b)returns double

Subtracts the second number from the first.

core.subtract(10, 3)
Messaging3
core.broadcastMessage(String msg)action

Broadcasts a message to every player on the server.

core.broadcastMessage("Hello everyone!")
core.colorString(String s)returns String

Turns & color codes in a piece of text into real Minecraft colors.

core.colorString("&aHello!")
core.sendColorMessage(Player player, String message)action

Sends a chat message to one player, supporting & color codes and hex (&#rrggbb).

core.sendColorMessage(player, "&aYou used the ability!")
Movement12
core.createVector(String x, String y, String z)returns Vector

Builds a direction/velocity vector from x, y, z math expressions.

core.createVector("0", "1", "0")
core.dashForward(Player player, double power, double lift)action

Launches the player forward in the direction they are looking, with a horizontal power and an upward lift. Use it for a dash, leap or blink-step.

core.dashForward(player, 1.35, 0.42)
core.disableFly(Player player)action

Stops a player from flying.

core.disableFly(player)
core.enableFly(Player player)action

Lets a player fly.

core.enableFly(player)
core.freeze(Entity target, long duration)action

Freezes an entity in place for the given duration (in ticks) by keeping it at its current spot.

core.freeze(victim, 60)
core.setRotation(Entity entity, float y, float p)action

Turns an entity to face the given yaw and pitch without moving it.

core.setRotation(player, 90, 0)
core.setVelocity(Entity player, String x, String y, String z)action

Pushes an entity (player, victim, or any mob) using x, y, z math expressions as the velocity direction and strength.

core.setVelocity(player, "0", "1.5", "0")
core.setVelocityByVector(Entity player, Vector vector)action

Pushes an entity (player, victim, or any mob) using a ready-made velocity vector.

core.setVelocityByVector(player, player.getLocation().getDirection())
core.teleport(Entity entity, double x, double y, double z)action

Teleports an entity to the given x, y, z in its current world (keeps its facing direction).

core.teleport(player, 100, 65, -200)
core.teleportForward(LivingEntity player, double range, boolean skipBlocks)action

Dashes a living entity forward in the direction it is looking, up to the given range (skipBlocks=true lets it pass through walls).

core.teleportForward(player, 10, false)
core.teleportToEntity(Entity v, Entity v1)action

Teleports one entity directly to another entity's position.

core.teleportToEntity(player, victim)
core.teleportToLocation(Entity v, Location v1)action

Teleports an entity to a specific location.

core.teleportToLocation(player, victim.getLocation())
Particle animations2
core.createAnimation()returns ParticleAnimation

Creates an empty particle animation. Set its orientation (world/yaw/look), anchor (feet/body/eyes/above_head), speed and period, then add layers made with core.createAnimationLayer(). Play it with particles.playAnimation.

core.createAnimation()
core.createAnimationLayer()returns AnimationLayer

Creates one particle animation layer. Set its shape, particle or color1/color2, colorMode, radius, count, spin and more, then add it with animation.getLayers().add(layer).

core.createAnimationLayer()
Particles2
core.createParticle(World world, double x, double y, double z, ParticleDisplay particle, int speed, int amount, int lastForTicks)action

Spawns a particle effect at the x, y, z position every tick for the given number of ticks.

core.createParticle(player.getWorld(), 100, 65, -200, particles.colored(255, 0, 0, 1), 0, 1, 40)
core.createParticleByLocation(Location location, ParticleDisplay particle, int speed, int amount, int lastForTicks)action

Spawns a particle effect at a location every tick for the given number of ticks.

core.createParticleByLocation(player.getLocation(), particles.colored(255, 0, 0, 1), 0, 1, 40)
Players13
core.executeCommand(Player player, String command)action

Makes a player run a command as if they typed it in chat.

core.executeCommand(player, "spawn")
core.getPlayerByName(String name)returns Player

Finds an online player by their name, or returns nothing if they are offline.

core.getPlayerByName("Notch")
core.getPlayerByUUID(UUID uuid)returns Player

Finds an online player by their UUID.

core.getPlayerByUUID(player.getUniqueId())
core.getPlayerByUUIDString(String uuid)returns Player

Finds an online player by their UUID written as text.

core.getPlayerByUUIDString("069a79f4-44e9-4726-a5be-fca90e38aaf5")
core.getPlayerStatValue(Player player, String statName)returns int

Returns the value of one of a player's custom stats by name.

core.getPlayerStatValue(player, "mana")
core.hidePlayer(Player player)action

Hides a player so no other online player can see them.

core.hidePlayer(player)
core.hidePlayerDuration(Player player, long duration)action

Hides a player from everyone, then makes them visible again after the given number of ticks.

core.hidePlayerDuration(player, 100)
core.isHealthBelowPercent(Player player, double fraction)returns boolean

True when the player's health is below the given fraction of their maximum (0.3 = below 30%). Great for a low-health proc with no code.

core.doIf(core.isHealthBelowPercent(player, 0.3), "...")
core.isStandingStill(Player player)returns boolean

True when the player is barely moving (standing still). Use it to gate an effect that only runs while still, with no velocity math.

core.doIf(core.isStandingStill(player), "...")
core.onlinePlayers()returns List

Returns the list of all players currently online on the server.

core.onlinePlayers()
core.setGamemode(Player player, String gamemode)action

Changes a player's game mode (survival, creative, adventure, spectator).

core.setGamemode(player, "creative")
core.showPlayer(Player player)action

Makes a hidden player visible to everyone again.

core.showPlayer(player)
core.showPlayerDuration(Player player, long duration)action

Makes a player visible to everyone, then hides them again after the given number of ticks.

core.showPlayerDuration(player, 100)
Projectiles5
core.createEquationVector(String x, String y, String z)returns EquationVector

Builds a movement equation (using 't' for time in ticks) that shapes a custom projectile path. Axes are relative to the shooter's facing: X = forward (the way they look), Y = up, Z = left. A normal forward-flying projectile puts the motion on X, e.g. createEquationVector("t * 0.4", "0", "0"); use Y for arc and Z to curve sideways.

core.createEquationVector("t * 0.4", "0", "0")
core.projectileItem(String material)returns ProjectileItem

Builds an item projectile body from a material name, handy for flinging a block or any item as an ITEM projectile. Same chainable styling as the ItemStack version (small/visible/marker/rotation/spin/trail).

core.shootProjectile(player, player.getEyeLocation(), "ITEM", core.projectileItem("STONE").spin(15), 60, true, core.createEquationVector("t * 0.5", "0", "0"))
core.projectileItem(ItemStack display)returns ProjectileItem

Builds an item projectile body: an invisible armor stand wearing the given item on its head. Pass it as the val of shootProjectile with type ITEM. Chain small(true) for a small stand, visible(true) to show the stand, marker(false) to give it a hitbox, rotation(x, y, z) to tilt the item in degrees, spin(degreesPerTick) to make it spin while it flies, trail(particleDisplay) to leave a particle trail, and trailEvery(ticks) to thin that trail out.

core.shootProjectile(player, player.getEyeLocation(), "ITEM", core.projectileItem(core.skullOwner(player.getName())).spin(20).trail(particles.colored(255, 80, 0, 1)), 60, true, core.createEquationVector("t * 0.4", "0", "0"))
core.shootArrow(LivingEntity player)returns Arrow

Makes a living entity shoot an arrow in the direction it is looking.

core.shootArrow(player)
core.shootProjectile(Player player, Location location, ProjectileType type, Object val, int timeAliveTicks, boolean splashHit, EquationVector equationVector)action

Fires a custom ItemsCore projectile from a player. The type is one of PARTICLE or ITEM, val is the body to fly (a ParticleDisplay, or a projectileItem(...) for ITEM), timeAliveTicks is how long it lives, splashHit keeps it going through entities, and the last argument is the flight path from createEquationVector.

core.shootProjectile(player, player.getEyeLocation(), "PARTICLE", particles.colored(255, 80, 0, 3), 60, true, core.createEquationVector("t * 0.5", "0", "0"))
Sound2
core.getSound(String string)returns Sound

Looks up a Minecraft sound by its name.

core.getSound("ENTITY_GENERIC_EXPLODE")
core.playSound(Player player, Location location, Sound sound, double volume, double pitch)action

Plays a sound to a player at a location with the given volume and pitch.

core.playSound(player, player.getLocation(), core.getSound("ENTITY_GENERIC_EXPLODE"), 1, 1)
Utility2
core.getCurrentTimeMs()returns long

Returns the current system time in milliseconds, handy for cooldowns.

core.getCurrentTimeMs()
core.parsePlaceholder(Player player, String string)returns String

Replaces PlaceholderAPI placeholders in text with their real values for a player.

core.parsePlaceholder(player, "%player_name%")
Variables5
core.getGlobalVariable(String variable)returns Object

Reads a global (server-wide) saved variable by name, creating it empty if it does not exist.

core.getGlobalVariable("boss_spawned")
core.getPlayerVariable(Player player, String variable, boolean temp)returns Object

Reads a saved variable stored on a player, creating it empty if missing (use temp=true for variables cleared on logout).

core.getPlayerVariable(player, "kills", false)
core.getPlayerVariableOrDefault(Player player, String variable, Object def, boolean temp)returns Object

Reads a player's saved variable, or sets and returns a default value if it does not exist yet.

core.getPlayerVariableOrDefault(player, "kills", 0, false)
core.setGlobalVariable(String variable, Object value)action

Saves a global (server-wide) variable by name so it persists and can be read later.

core.setGlobalVariable("boss_spawned", true)
core.setPlayerVariable(Player player, String variable, Object value, boolean temp)action

Saves a variable on a player (use temp=true for variables cleared when they log out).

core.setPlayerVariable(player, "kills", 5, false)
World8
core.addToLocation(Location location, double x, double y, double z)returns Location

Returns a new location shifted by the given x, y, z amounts.

core.addToLocation(player.getLocation(), 0, 5, 0)
core.cloneLocation(Location location)returns Location

Makes a copy of a location so you can change it without affecting the original.

core.cloneLocation(player.getLocation())
core.createExplosion(World world, double x, double y, double z, int power)action

Creates an explosion of the given power at the x, y, z position in a world.

core.createExplosion(player.getWorld(), 100, 65, -200, 4)
core.createExplosionByLocation(Location location, int power)action

Creates an explosion of the given power at a location.

core.createExplosionByLocation(victim.getLocation(), 4)
core.getLocation(World world, double x, double y, double z)returns Location

Builds a location object from a world and x, y, z coordinates.

core.getLocation(player.getWorld(), 100, 65, -200)
core.getWorld(String worldName)returns World

Gets a world by its name, or nothing if no world has that name.

core.getWorld("world")
core.summonLightning(World world, double x, double y, double z)action

Strikes lightning at the given x, y, z position in a world.

core.summonLightning(player.getWorld(), 100, 65, -200)
core.summonLightningByLocation(Location location)action

Strikes lightning at a location.

core.summonLightningByLocation(victim.getLocation())

particlesParticle shapes and displays (circles, helixes, custom particles).

Particle animations4
particles.playAnimation(Player player, ParticleAnimation animation, int ticks)action

Plays a particle animation on a player for a number of ticks (20 = 1 second). The same orientation/anchor/shape-layer engine the runes use. Build the animation with core.createAnimation() and core.createAnimationLayer().

particles.playAnimation(player, anim, 60)
particles.playAnimation(Player player, String name, int ticks)action

Plays a saved animation by name on a player for a number of ticks (20 = 1 second). This is the easy no-code way: build the animation in /ic animations, then just name it here. No core.createAnimation needed.

particles.playAnimation(player, "halo", 60)
particles.playAnimationAt(Location location, String name, int ticks)action

Plays a saved animation by name at a fixed world location for a number of ticks (20 = 1 second). The no-code way for block or hit-point effects: build it in /ic animations, then reference the name here.

particles.playAnimationAt(loc, "halo", 60)
particles.playAnimationAt(Location location, ParticleAnimation animation, int ticks)action

Plays a particle animation at a fixed world location for a number of ticks (20 = 1 second). Use this for animations not tied to a player, such as on a block or a projectile hit point.

particles.playAnimationAt(loc, anim, 60)
Particle Shapes48
particles.atom(int orbits, double radius, double rate, ParticleDisplay orbit, ParticleDisplay nucleus)action

Draws a static atom with orbit rings and a nucleus of particles at the display's location.

particles.atom(3, 2, 30, particles.colored(0, 255, 255, 1), particles.colored(255, 0, 0, 1))
particles.atomic(int orbits, double radius, double rate, int lifetime, ParticleDisplay orbit)action

Animates an atom with spinning orbit rings of particles at the display's location for a number of ticks.

particles.atomic(3, 2, 30, 200, particles.colored(0, 255, 255, 1))
particles.blackSun(double radius, double radiusRate, double rate, double rateChange, ParticleDisplay display)action

Draws a black sun shape made of shrinking circles at the display's location.

particles.blackSun(3, 0.5, 60, 2, particles.colored(0, 0, 0, 1))
particles.blackhole(int points, double radius, double rate, int mode, int time, ParticleDisplay display)action

Animates a swirling blackhole of particles at the display's location for a number of ticks (mode changes the shape).

particles.blackhole(8, 2, 30, 1, 200, particles.colored(75, 0, 130, 1))
particles.cage(Location start, Location end, double rate, double barRate, ParticleDisplay display)action

Draws a cage of vertical particle bars between two corner locations, useful for trapping effects.

particles.cage(player.getLocation(), player.getLocation().add(3, 0, 3), 0.5, 3, particles.colored(255, 255, 255, 1))
particles.chaoticDoublePendulum(double radius, double gravity, double length, double length2, double mass1, double mass2, boolean dimension3, int speed, int lifetime, ParticleDisplay display)action

Animates a chaotic double-pendulum swing of particles at the display's location for a number of ticks.

particles.chaoticDoublePendulum(3, 1, 1, 1, 1, 1, false, 2, 200, particles.colored(255, 255, 255, 1))
particles.circle(double radius, double radius2, double extension, double rate, double limit, ParticleDisplay display)action

Draws a circle (or oval) of particles at the display's location.

particles.circle(2, 2, 1, 60, 0, particles.colored(255, 0, 0, 1))
particles.circularBeam(double maxRadius, double rate, double radiusRate, double extend, int lifetime, ParticleDisplay display)action

Draws a moving beam of pulsing circles that travels forward in the display's direction for a number of ticks.

particles.circularBeam(2, 30, 20, 0.5, 40, particles.colored(255, 255, 0, 1))
particles.cloud(ParticleDisplay cloud, ParticleDisplay rain)action

Continuously spawns a raincloud effect using the two given particle displays.

particles.cloud(particles.withLocation(particles.colored(200, 200, 200, 2), player.getLocation()), particles.withLocation(particles.colored(0, 0, 255, 1), player.getLocation()))
particles.cone(double height, double radius, double rate, double circleRate, ParticleDisplay display)action

Draws a cone of particles standing up from the display's location.

particles.cone(3, 2, 0.1, 60, particles.colored(255, 128, 0, 1))
particles.crescent(double radius, double rate, ParticleDisplay display)action

Draws a crescent moon shape of particles at the display's location.

particles.crescent(2, 30, particles.colored(255, 255, 0, 1))
particles.cube(Location start, Location end, double rate, ParticleDisplay display)action

Draws a hollow cube (all six faces filled) of particles between two corner locations.

particles.cube(player.getLocation(), player.getLocation().add(2, 2, 2), 0.5, particles.colored(0, 255, 0, 1))
particles.cylinder(double height, double radius, double rate, ParticleDisplay display)action

Draws a cylinder of particles standing up from the display's location.

particles.cylinder(3, 2, 30, particles.colored(0, 255, 0, 1))
particles.diamond(double radiusRate, double rate, double height, ParticleDisplay display)action

Draws a diamond (rotated square) shape of particles standing up at the display's location.

particles.diamond(0.2, 0.1, 2, particles.colored(0, 255, 255, 1))
particles.dna(double radius, double rate, double extension, int height, int hydrogenBondDist, ParticleDisplay display, ParticleDisplay hydrogenBondDisplay)action

Draws a DNA double-helix of particles rising from the display's location, with bond lines between the strands.

particles.dna(1.5, 0.1, 0.5, 10, 3, particles.colored(0, 0, 255, 1), particles.colored(255, 255, 255, 1))
particles.dnaReplication(double radius, double rate, int speed, double extension, int height, int hydrogenBondDist, ParticleDisplay display)action

Animates a growing DNA strand with colored nucleotide bonds rising from the display's location.

particles.dnaReplication(1.5, 0.1, 2, 0.5, 10, 3, particles.colored(255, 255, 255, 1))
particles.drawLine(LivingEntity player, double length, double rate, ParticleDisplay display)action

Draws a straight line of particles out from a living entity's eyes in the direction it is looking.

particles.drawLine(player, 10, 0.2, particles.colored(255, 0, 0, 1))
particles.ellipse(double start, double end, double rate, double radius, double otherRadius, ParticleDisplay display)action

Draws an ellipse (oval) arc of particles between the start and end angles at the display's location.

particles.ellipse(0, 6.28, 0.1, 3, 2, particles.colored(0, 255, 0, 1))
particles.explosionWave(double rate, ParticleDisplay display, ParticleDisplay secDisplay)action

Animates an expanding explosion shockwave of particles at the display's location.

particles.explosionWave(30, particles.colored(255, 128, 0, 1), particles.colored(255, 0, 0, 1))
particles.eye(double radius, double radius2, double rate, double extension, ParticleDisplay display)action

Draws an eye shape of particles at the display's location.

particles.eye(1, 1, 30, 1, particles.colored(255, 255, 255, 1))
particles.filledCircle(double radius, double rate, double radiusRate, ParticleDisplay display)action

Draws a solid filled disc of particles at the display's location.

particles.filledCircle(3, 60, 0.2, particles.colored(255, 0, 0, 1))
particles.filledCube(Location start, Location end, double rate, ParticleDisplay display)action

Draws a fully solid cube of particles between two corner locations.

particles.filledCube(player.getLocation(), player.getLocation().add(2, 2, 2), 0.5, particles.colored(255, 0, 0, 1))
particles.flower(int count, double radius, ParticleDisplay display, Runnable runnable)action

Draws a flower-petal pattern, running the given task at each petal point around the display's location.

particles.heart(double cut, double cutAngle, double depth, double compressHeight, double rate, ParticleDisplay display)action

Draws a heart shape of particles at the display's location.

particles.heart(2, 4, 2, 3, 40, particles.colored(255, 0, 100, 1))
particles.helix(int strings, double radius, double rate, double extension, double length, double speed, double rotationRate, boolean fadeUp, boolean fadeDown, ParticleDisplay display)action

Animates a spiral helix of particles rising in the display's direction (fadeUp and fadeDown taper the ends).

particles.helix(2, 2, 30, 1, 10, 0.1, 5, true, true, particles.colored(0, 255, 0, 1))
particles.hypercube(Location startOrigin, Location endOrigin, double rate, double sizeRate, int cubes, ParticleDisplay display)action

Draws nested wireframe cubes connected like a 4D hypercube between two corner locations.

particles.hypercube(player.getLocation(), player.getLocation().add(2, 2, 2), 0.3, 0.5, 2, particles.colored(128, 0, 255, 1))
particles.illuminati(double size, double extension, ParticleDisplay display)action

Draws an illuminati triangle-with-an-eye symbol of particles at the display's location.

particles.illuminati(2, 1, particles.colored(255, 255, 0, 1))
particles.infinity(double radius, double rate, ParticleDisplay display)action

Draws an infinity (figure-eight) symbol of particles at the display's location.

particles.infinity(2, 30, particles.colored(0, 255, 255, 1))
particles.julia(double size, double zoom, int colorScheme, double moveX, double moveY, ParticleDisplay display)action

Draws a flat Julia-set fractal pattern of particles at the display's location.

particles.julia(3, 1, 50, 0, 0, particles.colored(255, 255, 255, 1))
particles.lightning(Location start, Vector direction, int entries, int branches, double radius, double offset, double offsetRate, double length, double lengthRate, double branch, double branchRate, ParticleDisplay display)action

Draws a jagged branching lightning bolt of particles from a start point in a direction.

particles.lightning(player.getEyeLocation(), player.getLocation().getDirection(), 5, 3, 0.5, 1, 0.8, 3, 0.7, 0.5, 0.7, particles.colored(255, 255, 0, 1))
particles.line(Location start, Location end, double rate, ParticleDisplay display)action

Draws a straight line of particles between two locations.

particles.line(player.getLocation(), victim.getLocation(), 0.2, particles.colored(255, 0, 0, 1))
particles.magicCircles(double radius, double rate, double radiusRate, double distance, ParticleDisplay display)action

Continuously draws growing magic circles that travel forward in the display's direction.

particles.magicCircles(1, 30, 20, 0.2, particles.colored(128, 0, 255, 1))
particles.mandelbrot(double size, double zoom, double rate, double x0, double y0, int color, ParticleDisplay display)action

Draws a flat Mandelbrot fractal pattern of particles at the display's location.

particles.mandelbrot(3, 1, 0.1, 0, 0, 50, particles.colored(255, 255, 255, 1))
particles.neopaganPentagram(double size, double rate, double extend, ParticleDisplay star, ParticleDisplay circle)action

Draws a pentagram star inside a circle at the display's location.

particles.neopaganPentagram(2, 0.05, 0, particles.colored(255, 0, 0, 1), particles.colored(255, 255, 255, 1))
particles.polygon(int points, int connection, double size, double rate, double extend, ParticleDisplay display)action

Draws a polygon outline of particles with the given number of points at the display's location (use connection to make stars).

particles.polygon(5, 1, 2, 0.05, 0, particles.colored(0, 255, 0, 1))
particles.rainbow(double radius, double rate, double curve, double layers, double compact, ParticleDisplay display)action

Draws a multi-colored rainbow arc of particles at the display's location.

particles.rainbow(3, 30, 0.6, 2, 0.1, particles.colored(255, 0, 0, 1))
particles.rectangle(Location start, Location end, double rate, ParticleDisplay display)action

Draws a filled flat rectangle of particles between two corner locations.

particles.rectangle(player.getLocation(), player.getLocation().add(3, 3, 0), 0.3, particles.colored(0, 255, 0, 1))
particles.ring(double rate, double radius, double tubeRadius, ParticleDisplay display)action

Draws a ring (donut/torus) shape of particles at the display's location.

particles.ring(30, 2, 0.5, particles.colored(0, 255, 255, 1))
particles.slash(double size, boolean useWideSide, ParticleDisplay display)action

Draws a sword-slash arc of particles at the display's location (useWideSide makes the wider half of the swing).

particles.slash(2, false, particles.colored(255, 255, 255, 1))
particles.slash(Plugin plugin, double distance, boolean useWideSide, Supplier size, Supplier speed, ParticleDisplay display)action

Draws an animated sword slash that travels forward in the display's direction over a distance.

particles.sphere(double radius, double rate, ParticleDisplay display)action

Draws a hollow sphere of particles at the display's location.

particles.sphere(2, 30, particles.colored(255, 0, 0, 1))
particles.spikeSphere(double radius, double rate, int chance, double minRandomDistance, double maxRandomDistance, ParticleDisplay display)action

Draws a spiky ball of particles (a sphere with random spikes sticking out) at the display's location.

particles.spikeSphere(2, 30, 5, 0.5, 1.5, particles.colored(255, 0, 0, 1))
particles.spread(int amount, int rate, Location start, Location originEnd, double offsetx, double offsety, double offsetz, ParticleDisplay display)action

Animates scattering lines of particles from a start point toward a randomly spread end area.

particles.spread(100, 5, player.getLocation(), victim.getLocation(), 1, 1, 1, particles.colored(255, 0, 0, 1))
particles.star(int points, int spikes, double rate, double spikeLength, double coreRadius, double neuron, boolean prototype, int speed, ParticleDisplay display)action

Animates a spiky star burst of particles at the display's location.

particles.star(5, 8, 30, 1.5, 1, 0.1, false, 2, particles.colored(255, 255, 0, 1))
particles.structuredCube(Location start, Location end, double rate, ParticleDisplay display)action

Draws only the edges (wireframe) of a cube of particles between two corner locations.

particles.structuredCube(player.getLocation(), player.getLocation().add(2, 2, 2), 0.3, particles.colored(0, 255, 255, 1))
particles.tesseract(double size, double rate, double speed, long ticks, ParticleDisplay display)action

Animates a rotating 4D tesseract of particles at the display's location for a number of ticks.

particles.tesseract(2, 0.3, 0.05, 200, particles.colored(0, 255, 255, 1))
particles.vortex(int points, double rate, int lifetime, ParticleDisplay display)action

Animates a spinning vortex of spreading particles at the display's location for a number of ticks.

particles.vortex(8, 30, 200, particles.colored(128, 0, 255, 1))
particles.waveFunction(double extend, double heightRange, double size, double rate, ParticleDisplay display)action

Draws a wavy rippling surface of particles at the display's location.

particles.waveFunction(0.2, 2, 1, 30, particles.colored(0, 128, 255, 1))
Particles8
particles.colored(int r, int g, int b, float size)returns ParticleDisplay

Creates a colored dust particle display from red, green, blue (0-255) and a size.

particles.colored(255, 0, 0, 1)
particles.createCustomParticle(String particle, int count, double extra, boolean force, String offset, String direction, double size, String color, String blockdata, String itemstack, String materialdata)returns CustomParticle

Builds a fully customized particle definition (count, size, color, block/item data and more) to turn into a display.

particles.custom(particles.createCustomParticle("DUST", 1, 0, false, "0,0,0", "0,0,0", 1, "255,0,0", "", "", ""))
particles.custom(CustomParticle customParticle)returns ParticleDisplay

Turns a custom particle definition into a particle display you can use in shapes.

particles.custom(particles.createCustomParticle("FLAME", 1, 0, false, "0,0,0", "0,0,0", 1, "", "", "", ""))
particles.of(String particle)returns ParticleDisplay

Creates a particle display from a particle name, used as the look for particle shapes.

particles.of("FLAME")
particles.randInt(int min, int max)returns int

Returns a random whole number between the two values (both ends included).

particles.randInt(1, 10)
particles.random(double min, double max)returns double

Returns a random decimal number between the two values.

particles.random(0.5, 2.0)
particles.withDirection(ParticleDisplay particleDisplay, Vector direction)returns ParticleDisplay

Sets the direction a particle display points in.

particles.withDirection(particles.colored(255, 0, 0, 1), player.getLocation().getDirection())
particles.withLocation(ParticleDisplay particleDisplay, Location location)returns ParticleDisplay

Sets the location where a particle display will be drawn.

particles.withLocation(particles.colored(255, 0, 0, 1), player.getLocation())

valuesConstant and value helpers usable as method arguments.

Variables2
values.value(String input)returns Object

Turns a piece of text into its real type (number, true/false, or text) automatically.

values.value("42")
values.variable(String name)returns Object

Reads a script variable that is currently available by its name.

values.variable("player")

apiItemsCore API accessors usable from actions.

Economy1
api.isUsingVault()returns boolean

Checks whether the Vault economy plugin is installed and available.

api.isUsingVault()
Items4
api.getItemByName(String name)returns Item

Finds one of your custom items by its name, or nothing if no item has that name.

api.getItemByName("magic_sword")
api.getItemName(ItemStack stack)returns String

Returns the custom name of an item stack.

api.getItemName(player.getItemInHand())
api.giveItem(Player player, Item item)action

Gives a player one of your custom items.

api.giveItem(player, api.getItemByName("magic_sword"))
api.tryGetItemFromPlayerHand(Player player)returns Item

Returns the custom item a player is holding, or nothing if it is not an ItemsCore item.

api.tryGetItemFromPlayerHand(player)
Players1
api.getInput()returns PlayerInput

Returns the helper used to ask a player for typed chat input.

api.getInput()
Stats3
api.getPlayerStat(Player player, String stat)returns int

Returns a player's live total for a stat: its base value plus the stat from every held, worn, off-hand and talisman item (reforges included). Use it to calculate damage or feed another plugin.

api.getPlayerStat(player, "damage")
api.getPlayerStats(Player player)returns Map

Returns all of a player's live total stats as a map of stat name to value.

api.getPlayerStats(player)
api.recalculatePlayerStats(Player player)action

Forces an immediate recalculation of a player's live total stats. Call it right before reading a stat if you need a value that reflects a change made this same tick.

api.recalculatePlayerStats(player)
Uncategorized1
api.registerStatBridge(StatBridge bridge)action

No description yet.

iWriting a Java addon? The Developer Documentation covers the API and how to add your own methods, attributes, listeners and actions.