Repository navigation
Modifiers
hp-1e edited this page Oct 31, 2026
·
1 revision
English | 中文
ArsenalModifierEvents.data(event => {
event.create('kubejs:vampire')
.color('B02030')
.name('Vampire').name('zh_cn', '吸血')
.flavor('Blood for blood')
.description('Deals more melee damage and heals on hit')
.statBoost('tconstruct:attack_damage', 'add', 0.5)
.icon('minecraft:item/redstone')
.levelDisplay('default')
.tooltipDisplay('always')
.priority(100)
})| Method | Description |
|---|---|
.color('RRGGBB') |
Modifier color |
.name/.flavor/.description([lang,] text) |
Name, flavor line and description |
.statBoost(toolStat, operation, perLevel) |
Native Tinkers stat boost; operation is add percent multiply_base multiply_conditional multiply_all
|
.module(moduleType, {...}) |
Any Tinkers modifier module, written as is |
.icon(sprites...) |
Icon in the book and JEI; multiple sprites are layered in order. Sprites must be on the block atlas, such as minecraft:item/* or tconstruct:gui/modifiers/*; your own go in kubejs/assets/kubejs/textures/item/<name>.png as kubejs:item/<name>
|
.levelDisplay(value) |
default single_level no_levels pluses
|
.tooltipDisplay(value) |
always tinker_station never
|
.priority(n) |
Modifier priority |
Names, descriptions, colors and icons are synced to clients. To put the modifier on a tool you still need a modifier recipe (see Recipes), or test with /tconstruct modifiers @s add <id> <level>.
Script-defined modifiers automatically carry an event module. Listen by modifier ID; handlers fire only for tools or armor with that modifier, and only on the server. After changing handler logic, /kubejs reload server_scripts is enough.
// While computing melee damage; damage can be changed
ArsenalModifierEvents.meleeDamage('kubejs:vampire', event => {
event.damage = event.damage * (1 + 0.1 * event.level)
})
// After the hit; event.damage is the damage actually dealt
ArsenalModifierEvents.afterMeleeHit('kubejs:vampire', event => {
event.attacker.heal(event.damage * 0.05 * event.level)
})
// Before armor reduction; fires once per armor piece with the modifier
ArsenalModifierEvents.hurt('kubejs:guard', event => {
event.damage = Math.max(0, event.damage - event.level)
})| Event | When | Main fields |
|---|---|---|
meleeDamage |
Computing melee damage | Writable damage; baseDamage
|
afterMeleeHit |
After a melee hit |
damage is the damage dealt |
projectileHit |
Projectile hits an entity |
projectile hitEntity attacker target blocked modifiers
|
blockBreak |
After breaking a block |
pos state world player entity isAOE() canHarvest() isEffective()
|
hurt |
Before armor reduction | Writable damage; entity slot source directDamage
|
damage |
After armor reduction | Same as hurt
|
toolStats |
When the tool is rebuilt |
add/percent/multiply/multiplyAll(stat, value), get(stat), hasTag(tag), modifierLevel(id), itemId
|
attributes |
When the tool is rebuilt |
add(attribute, amount, 'addition'|'multiply_base'|'multiply_total'), slot
|
- Every event has
level,effectiveLevelandmodifier; tool events also havetool. - Attack events (
meleeDamage,afterMeleeHit) haveattackerplayertargetlivingTargethandslotprojectilecriticalfullyChargedextraAttackbaseDamagedamage.
Applies to every Tinkers tool, with or without a modifier:
ArsenalToolEvents.stats(event => {
if (event.hasTag('tconstruct:modifiable/harvest')) event.percent('tconstruct:mining_speed', 0.1)
if (String(event.itemId) == 'kubejs:war_pick') event.add('tconstruct:attack_damage', 1)
})Usable in any KubeJS event:
ArsenalTool.isTool(item)
ArsenalTool.modifierLevel(item, 'kubejs:vampire')
ArsenalTool.hasModifier(item, 'kubejs:vampire')
ArsenalTool.armorModifierLevel(entity, 'kubejs:guard') // sum over all four armor pieces
ArsenalTool.projectileModifierLevel(arrow, 'kubejs:vampire')
ArsenalTool.getInt(item, 'kubejs:kills') // persistent tool data
ArsenalTool.setInt(item, 'kubejs:kills', 10)
ArsenalTool.getFloat(item, key) / ArsenalTool.setFloat(item, key, value)
ArsenalTool.rebuild(item) // recompute stats with the current scripts- Modifier events fire only for modifiers defined by this mod. For built-in Tinkers modifiers, combine
ArsenalToolwith KubeJS's own events. -
toolStats,attributesandArsenalToolEvents.statsare computed and stored when the tool is rebuilt, so they can only depend on the tool's own data. Put conditions that change all the time into events likemeleeDamage. After you change a script, existing tools update on their next rebuild (adding a modifier, repairing, ...) or when you callArsenalTool.rebuild(item). - The Tinker Station preview rebuilds tools on the client thread, so stat event handlers must not depend on world state or do expensive work.