ellipog

Channels

unreleased

Minecraft 26.3Fabric + NeoForge

A channelChannelOne named number a scale can drive, such as reach or motion. Unset, it follows the base scale raised to an exponent; an override replaces it.See also Scale frame is one named number a scale can drive. It is either unset, in which case it follows the scale or stays off, or overridden, in which case it reads exactly what was set. The rule is:

value = override, else basis ^ exponent

The basis is usually the uniform scale. Body-physics channels follow it so reach, step, motion, jump and flight feel proportional. Combat, defence, health, AI ranges and physics constants do not follow, because vanilla already scales what needs scaling and following would double-apply it or clamp it into nonsense. Stature has 48 built-in channels; a mod may declare more, and any id outside the stature: namespace is experimental.

Taxonomy#

KindChannelsDefault
Body physicsreach_block, reach_entity, step_height, motion, jump, flying_speed, safe_fall_distanceFollows the scale with a tuned exponent
Physical extrasprojectile_scale, item_pickup_range, riding_offset, explosion_scale, drops_scaleFollows the scale; the server config also gives each a switch, a strength and min/max clamps
Combat, defence, health, AI rangesattack, attack_speed, attack_knockback, sweeping_damage, defense, armor_toughness, knockback_resistance, explosion_knockback_resistance, health, absorption, luck, oxygen_bonus, follow_range, tempt_range, burning_time, mining_speed, submerged_mining_speed, mining_efficiencyOff until overridden
Physics constantsgravity, friction, air_drag, bounciness, fall_damage, movement_efficiency, water_movement_efficiency, sneaking_speedOff until overridden
Already scaled by vanillacamera_distanceOff; an override bends the vanilla result further
Visibility distancesname_tag_distance, below_name_distanceOff; an override shortens or lengthens how far a name is visible
Multiplier channelsknockback_received, knockback_dealt, saturationFollows where the law exists, otherwise off
Render onlymodel, visibility, held_item, shadowmodel follows the scale; shadow is off because vanilla already scales it; the rest are off

The built-in channels#

BASE means the channel follows the uniform scale. NONE means it writes nothing until it is overridden. The exponent is what the basis is raised to.

ChannelFollowsExponentDrives
stature:reach_blockBASE1.0Block interaction range
stature:reach_entityBASE1.0Entity interaction range
stature:step_heightBASE1.0Step height
stature:motionBASE0.5Movement speed
stature:jumpBASE0.5Jump strength
stature:mining_speedNONE1.0Block break speed
stature:submerged_mining_speedNONE1.0Submerged mining speed
stature:mining_efficiencyNONE1.0Mining efficiency
stature:attackNONE1.0Attack damage
stature:attack_speedNONE1.0Attack speed
stature:attack_knockbackNONE1.0Attack knockback
stature:sweeping_damageNONE1.0Sweeping damage ratio
stature:defenseNONE1.0Armour
stature:armor_toughnessNONE1.0Armour toughness
stature:knockback_resistanceNONE1.0Knockback resistance
stature:explosion_knockback_resistanceNONE1.0Explosion knockback resistance
stature:healthNONE1.0Maximum health
stature:absorptionNONE1.0Maximum absorption
stature:luckNONE1.0Luck
stature:oxygen_bonusNONE1.0Oxygen bonus
stature:follow_rangeNONE1.0Follow range
stature:tempt_rangeNONE1.0Tempt range
stature:movement_efficiencyNONE1.0Movement efficiency
stature:water_movement_efficiencyNONE1.0Water movement efficiency
stature:sneaking_speedNONE1.0Sneaking speed
stature:flying_speedBASE0.5Flying speed
stature:gravityNONE1.0Gravity
stature:safe_fall_distanceBASE1.0Safe fall distance
stature:fall_damageNONE1.0Fall damage multiplier
stature:burning_timeNONE1.0Burning time
stature:bouncinessNONE1.0Bounciness
stature:frictionNONE1.0Friction
stature:air_dragNONE1.0Air drag
stature:camera_distanceNONE1.0Camera distance, which vanilla already scales
stature:name_tag_distanceNONE1.0Name tag visibility distance
stature:below_name_distanceNONE1.0Below-name visibility distance
stature:modelBASE1.0The drawn model, not the box
stature:saturationNONE1.0Hunger exhaustion
stature:knockback_receivedBASE-0.5Incoming knockback power
stature:knockback_dealtBASE0.5Outgoing knockback power
stature:visibilityNONE1.0Hides the model, name tag and shadow below 0.5
stature:held_itemNONE1.0The held item, scaled around the hand
stature:shadowNONE1.0Shadow radius, on top of vanilla's own scale follow
stature:projectile_scaleBASE1.0Arrows, tridents, fireballs, potions, spit and other projectiles fired by this entity
stature:item_pickup_rangeBASE1.0The extra reach of the item and experience pickup scan
stature:riding_offsetBASE1.0The seat scale a mount passes to its passenger attachment
stature:explosion_scaleBASE0.5The radius of explosions this entity caused
stature:drops_scaleBASE0.5The count of loot-table stacks this entity drops

Physical extras#

These five channels are applied by Stature itself rather than by a vanilla attribute. They still use the normal override system, the normal save and sync, and the normal config gate. Their numeric tuning lives in Thresholds.

Projectiles#

A projectile takes a snapshot of its shooter's projectile_scale when it learns its owner, so one hook covers arrows, tridents, fireballs, potions, snowballs, llama spit and modded projectiles. The snapshot means a deflected projectile keeps the size and speed it was fired with.

  • The hitbox grows uniformly with the factor.
  • The drawn model grows by the same factor. One client hook at the entity render dispatcher covers arrows, spectral arrows, tridents, thrown items such as snowballs, eggs and potions, fireballs, wind charges, llama spit, shulker bullets and modded projectiles, so their renderers cannot disagree with their boxes.
  • The model is scaled around the projectile's render origin, the point the box grows from. It stays on the box's centre line, and an arrow stuck in a block keeps its head at the same depth.
  • Damage grows linearly: 1 + (factor - 1) * projectile_damage_strength.
  • Launch speed grows by factor ^ projectile_speed_strength; the default exponent 0.5 makes a 4x arrow fly twice as fast.
  • The factor is saved with the projectile, so an unloaded chunk does not shrink it. It is also sent to viewers when the projectile learns its owner and when a player starts tracking it, so a client whose copy of the owner is missing or stale still draws the server's size.
  • Explosion damage is not multiplied by this channel; the explosion channel owns that radius.

The projectile_scale switch gates the whole feature: hitbox, model, damage and speed. There is no separate render switch because the model and the box are meant to be one size; a visual-only switch would recreate the mismatch this channel exists to avoid. Turning projectile_scale off leaves newly fired projectiles exactly vanilla.

Pickup reach#

The player's existing item and experience scan is enlarged by the factor. Vanilla inflates the player's box by 1 block horizontally and 0.5 vertically; the channel scales that inflation, so the body box itself never becomes the pickup area. A small factor shrinks the extra reach but never below the body. The scan still runs once per tick, client scans stay vanilla, and no second query is added.

Riding offsets#

Vanilla already passes a living mount's own scale to its passenger attachment calculation. This channel lets a pack or an operator change that seat scale per mount. The value is the factor divided by the mount's uniform scale, so the default 1.0 is an exact no-op. Raising it on a normal horse stops a giant rider from sinking into it; lowering it does the opposite. The channel belongs to the mount.

Explosions#

An explosion caused by a creeper, a ghast fireball, or TNT primed by a living entity uses that entity's factor. The cause is resolved with vanilla's own rule: a projectile through its owner and primed TNT through the entity that lit it. TNT lit by redstone has no living cause and stays vanilla rather than being guessed from proximity. The radius is multiplied before the explosion is constructed, so the server calculation and the packet that draws the particles and sound agree.

Drops#

Only loot-table drops are touched. This is loot scalingLoot scalingMultiplying the count of loot-table stacks from a scaled entity. Only stackable items scale; uniques are never duplicated and equipment is untouched.See also Channel, and equipment, inventory contents and custom death drops do not pass through the loot-table consumer and are left alone. The count of each generated stack is multiplied, never re-rolled: luck, looting, the loot seed and conditions produce exactly the vanilla roll.

  • Only stackable items are scaled. An item whose maximum stack size is one, such as a sword or a saddle, is never duplicated.
  • A result above the item's stack size is split into several stacks with the original components.
  • The count never drops below vanilla, so a small entity does not get less loot.
  • The default exponent 0.5 and config maximum 3.0 mean a 16x entity drops at most three times the vanilla count.

What an override means#

For an attribute channel, the override is an absolute effective value. With a non-zero base it is applied as a multiplier of override / base - 1, so other mods' modifiers still compose on top. With a base near zero, such as luck or absorption, it is added instead, because no multiplier can move zero. An override of 1.0 is still an override: it asks for an effective value of 1.0, not for the channel to be unset. Use reset to remove an override; an unset channel whose effective factor is 1.0 carries no modifier at all.

For a multiplier channel such as the knockback pair or saturation, the override is the multiplier itself. A negative or non-finite override degrades to neutral rather than poisoning physics. knockback_received and knockback_dealt are read at the game's knockback funnels, so enchantments and knockback resistance still apply underneath.

For the five physical extras, the override is the factor itself. The global strength multiplier applies only to the followed value, not to an explicit override; the config min/max clamp applies to both, because it is a hitbox and explosion safety bound. A disabled channel returns exactly 1.0 even if an override is stored, and the override survives for when it is re-enabled.

For a render channel, the override is read when the entity is drawn:

ChannelAn override does this
modelReplaces the scale the model is drawn at. The box does not move
visibilityHides the model, name tag and shadow when below 0.5, shows them at 0.5 or above
held_itemScales the held item around the hand point
shadowMultiplies the shadow radius after vanilla's own scale follow

An unset NONE channel writes no modifier and reads 1.0. An unset BASE channel writes scale ^ exponent - 1, and a factor of exactly 1 removes the modifier. All attribute modifiers are transient, so they never reach a save; the overrides are saved with the entity and sent to players tracking it, and the effects are re-derived on load.

stature:below_name_distance was called stature:name_tag_height before the channel defaults were corrected. A saved override under the old id loads onto the new channel, and the rename is logged once.

A saved override for a channel this version no longer declares is skipped when the entity loads, rather than failing the save.

camera_distance is off because vanilla already multiplies it by the entity's scale, so following it here would square the effect. name_tag_distance and below_name_distance are off for a different reason: making them follow would leave a small entity's name visible only across a tiny distance, which is a stealth design rather than a size rule. shadow is off because vanilla already scales the shadow with the entity, so the channel only bends it further.

Frames and channels#

A frame may carry a channels object that sets any declared channel for the entities it sizes:

{
  "size": [1.2, 3.6],
  "channels": {
    "stature:projectile_scale": 2.0,
    "stature:explosion_scale": 1.5
  }
}

The values are ordinary overrides, eased with the frame's easing. Clearing the frame removes the overrides it introduced, unless an operator changed one of them after the frame was applied; that later choice is left alone. A channel an operator sets after the frame is just a normal override.

Commands#

/stature channel @s list
/stature channel @s stature:motion 0.5
/stature channel @s stature:attack 2
/stature channel @s stature:projectile_scale 2
/stature channel @s stature:attack reset

list prints every channel id with its resolved value and marks overrides with (override). A set value lands immediately; reset returns the channel to following the scale. The syntax is on Commands.

Support the workko-fi.com/ellipog