▶️ ЗАБЕРИ СВОИ 8 ПОДАРКОВ 🎁 ПРИ СОЗДАНИИ СВОЕГО МАЙНКРАФТ СЕРВЕРА
Allium

Allium

A modern, secure Essentials solution

Оцените первым
302
2
Все версииAllium v0.2.11a

Allium v0.2.11a

Release01.08.2026

Список изменений

Allium v0.2.11a

Wiki: https://github.com/castledking/Allium/wiki

Highlights

  • Animated GradientPlus names no longer rewind mid-cycle — The visible jolt was a phase-zero discontinuity created by Allium's generated three-stop MiniMessage gradient, compounded by TAB and Bukkit both trying to own the same tab-list name. Animated names now use a continuous two-stop path and a single writer. Multi-color presets use their real endpoints, while solid presets retain the subtle second-color animation by moving toward the nearest Minecraft color.
  • Store complete custom items from your hand/core item add <id> captures an item into plugins/Allium/items/<id>.yml; it can then be listed, updated, removed, reloaded or given without writing Java. The lossless item snapshot retains vanilla components and third-party metadata, while a readable vanilla: block makes common properties editable. Stored items also resolve through /give <player> ci:<id> and /i ci:<id>.
  • Harvest fields behave more like fields — Crop stage durations can be staggered so a field planted together does not ripen in lockstep. Mature crops can be picked or uprooted with different regrowth rules, growing-crop feedback can be exact, vague or silent, water and lava receive configurable vanilla-like behavior, and pistons now break crops instead of being stopped by them.
  • Minecraft-style selectors and destination teleports — The shared selector engine supports @p, @r, @a, @e and @s plus common filters. /tphere accepts multiple names and selectors, while the new /there command sends players, entities, selected pets or the sender to the block being looked at.
  • Chat respects the rest of the server — A cancelled chat event stays cancelled, recipients removed by mute, ignore or range plugins remain removed, /delmsg reliably removes every per-viewer copy of a message, and Discord-to-game messages resolve Nexo glyph placeholders before delivery.
  • Reliability pass — Folia repeating tasks can now be cancelled reliably, explicit Bukkit permission nodes win over coarse Brigadier op-level checks, WorldEdit-style // commands resolve correctly, Floodgate players are excluded from the Java translation probe, and Allium no longer prints Bukkit's raw usage line over its own formatted command errors.

Technical Details

Smooth animated names without losing solid-color movement

The animation counter itself was already correct. It matches the UnlimitedNametags phase cycle exactly: -1.0 through 1.0 in 0.1 steps, formatted with a US decimal separator and wrapped after 1.0.

The rewind came from how Allium transformed GradientPlus output. GradientPlus emits a color code before each character, including presets that are visually solid. Allium took the first and last extracted colors, invented a third stop by choosing the nearest named Minecraft color, and produced a tag shaped like this:

<gradient:#965CEA:#965CEA:blue:phase>Player</gradient>

MiniMessage reverses the color-stop array for negative phases. That is continuous for two endpoints, but with three or more stops the path itself changes as the phase crosses zero. For the live purple preset, the rendered jump from -0.1 to 0.0 was roughly three and a half times the movement of an ordinary frame, which looked like the name went backward once and then continued.

Allium now emits exactly two stops:

  • A real multi-color GradientPlus name uses its first and last character colors.
  • A solid GradientPlus preset pairs its color with the nearest Minecraft named color, preserving the subtle color movement without reintroducing a third-stop seam. The purple example becomes #965CEA to blue.
  • Chat's fallback formatter delegates to the same implementation as the tab-name animator, so the two cannot drift apart again.

There was a second source of instability in the tab list: multiple systems could write the same frame. GradientNameManager, the PacketEvents tab manager, Bukkit's playerListName API and TAB's own format cache could all update or restore an animated name at slightly different times.

The ownership rules are now explicit:

  • When TAB's API accepts an animated name, TAB is the only output path for that player. Bukkit is used only as a fallback when TAB is unavailable.
  • The PacketEvents tab manager no longer runs a second every-tick animation loop.
  • Relisting an existing TAB entry updates only its listed state and preserves the current animated display name.
  • Recreating a missing animated entry does not install TAB's cached placeholder result as a forced display name; the current animation owner immediately reasserts the live frame.
  • Party visibility changes schedule one next-tick reconciliation instead of the old chain of repeated rewrites. Each viewer/target transition carries a revision, so delayed work from an older visibility state cannot overwrite a newer one.

Regression tests render frames on both sides of the phase midpoint (-0.1, 0.0, 0.1) for solid and multi-color inputs and assert equal adjacent color movement. Separate tests enforce TAB/Bukkit writer exclusivity and the tab-relist policy.

Stored custom items

Stored items live one-per-file under plugins/Allium/items/. Keeping definitions separate means one unreadable file is skipped without preventing every other item from loading, and makes individual items easy to copy, edit or version-control.

CommandPurpose
/core item add <id>Capture the stack in the player's main hand
/core item update <id>Re-capture an existing item while preserving its Allium options
/core item remove <id>Delete the definition and unregister it
/core item reloadReload all stored item files without restarting
/core item listList built-in and stored item IDs
/core item give <player> <id> [amount]Give an item, respecting its permission and maximum amount
/give <player> ci:<id> or /i ci:<id>Use the existing custom-item give pipeline

IDs are normalized to lowercase and may contain only a-z, 0-9, _ and -. A stored definition cannot take the ID of a built-in behavior item such as tree_axe, spawner_changer or item_renamer.

Each generated file contains three layers:

  1. snapshot — Bukkit's serialized ItemStack, used as the lossless base. This retains components Allium does not model directly, including custom model data and metadata added by item plugins.
  2. vanilla — editable fields applied over the snapshot, including name, lore, damage, durability, stack size, model, rarity, repair cost, tooltip/glint state, item flags, enchantments and attribute modifiers.
  3. allium — delivery options: notify-receivers, an optional receiver permission, and max-give.

Deleting one property from the vanilla: block removes that modeled property from the rebuilt item. Deleting the entire block hands control back to the untouched snapshot. A file may also be authored with only material: and no snapshot for a simple vanilla item.

ItemEdit and ItemTag are optional soft dependencies. Allium still starts without them; when present, their item data remains part of the captured snapshot and their load order is respected. Nexo and Oraxen metadata is preserved the same way.

New permission nodes split routine use from item administration while preserving allium.admin as a compatibility override:

PermissionGrants
allium.item.give/core item give
allium.item.list/core item list
allium.item.adminAdd, update, remove and reload stored items

The custom-item registry is now case-insensitive at registration time and safely replaces its own definitions during reload. Give's armor probe also resolves ci: items without constructing or reporting an invalid item twice.

Harvest interaction, growth and regrowth

harvest/config.yml now has crop-defaults:. Every setting can be overridden per crop by adding the corresponding interaction: or growth: key to its crop file.

The new defaults are:

crop-defaults:
  interaction:
    right-click-harvest: true
    break-harvest: true
    progress-check: HINT
  growth:
    randomness: 0.25

right-click-harvest controls whether a mature plant can be picked in place. break-harvest controls whether breaking a mature plant runs its real mature-harvest table instead of the smaller break-drops.mature table. Immature plants always use break-drops.immature because they have no mature produce yet.

Growing-crop feedback has three modes:

ModeResult
TIMEShows the exact time until the next stage
HINTShows a whole-path progress description such as “Coming along” or “Nearly ready”
OFFRight-clicking a growing crop is silent

HINT is the default because an exact countdown is misleading when randomized stage duration is enabled. Bare YAML OFF is accepted even though YAML 1.1 parses that word as boolean false.

Regrowth may now differ based on how the crop was taken:

regrowth:
  enabled: true
  stage: 2
  on-right-click:
    enabled: true
    stage: 2
  on-break:
    enabled: false

The flat enabled/stage form remains the right-click rule for compatibility. Breaking defaults to removing the plant unless on-break.enabled is explicitly enabled. A source-specific block that omits stage inherits the shared stage instead of silently resetting the crop to stage zero.

Staggered crop timing

growth.randomness treats every configured stage duration as a mean. The default 0.25 spreads a 30-minute stage across 22 minutes 30 seconds to 37 minutes 30 seconds. Set it to 0.0 for the previous exact timing; values are clamped to 0.9.

The roll is deterministic for one crop instance and stage but unrelated between crops and stages. It is derived from the crop UUID rather than stored, so the regular growth engine and offline catch-up independently reproduce the same due times across restarts and chunk unloads. Replanting creates a new UUID and therefore a fresh roll; a plot cannot become permanently “fast.” Fertilizer and sprinkler speed multipliers apply after the spread and still scale the complete stage duration.

Liquids, pistons and crop visuals

Display-entity crops occupy air, so vanilla has no block to wash away or burn. Allium now listens for flowing liquids, player buckets and dispensers and applies a configurable response to the crop in the destination cell:

liquids:
  enabled: true
  water: DROP
  lava: BURN
ResponseBehavior
DROPDestroy the crop and return the same item loot a player break would return
BURNDestroy it with a hiss and smoke, returning nothing
DESTROYDestroy it silently with no loot
PROTECTCancel the fluid movement and leave the crop standing

Water defaults to DROP; a mature crop with break-harvest enabled returns its mature produce and additional item tables, including seeds. Lava defaults to BURN. Liquid destruction never executes command rewards because there is no player responsible for the harvest. Setting liquids.enabled: false leaves crops untouched and permits them to stand inside fluid.

PROTECT is intentionally not the default. A source fluid repeatedly retries a cancelled spread, so protecting large fields beside running water can create continuing event load.

Pistons no longer stop when a crop is in their path. The crop is destroyed instead, including crops hit by the extending piston head or rooted on a block being moved. Break-item tables can drop, but player-targeted command rewards do not run.

The default GROUND crop display offset changed from 0.0 to 0.43, lifting dropped-item-context models out of the soil. Full-block models authored for display-transform: NONE should generally keep y-offset: 0.0. The shipped tomato example also now guarantees seed return when a mature plant is uprooted, so its plant/harvest/replant loop cannot strand a player.

Upgrade notes for existing Harvest configurations

  • Missing crop-defaults and liquids sections use the defaults above; adding the blocks is optional unless different behavior is wanted.
  • Existing crop files with no growth.randomness inherit 0.25. Add randomness: 0.0 per crop or under crop-defaults.growth to retain exact durations.
  • Existing crop files inherit break-harvest: true, so breaking a mature plant now pays its mature harvest table and then follows the break-specific regrowth rule.
  • An existing crop-visuals.y-offset: 0.0 remains explicit and will not be overwritten. Change it to 0.43 manually if a GROUND model is still buried.
  • Crop defaults are re-read by /harvest reload. Changes to liquids.*, storage, module enablement and service-owned visual settings require a restart.

Selectors, /here and /there

The selector parser now has one structured result path instead of returning an unexplained empty list. Supported selectors are @p, @r, @a, @e and @s; supported arguments include:

type, name, tag, gamemode/gm, distance, limit, sort, world,
x, y, z, dx, dy, dz

type, name, tag and gamemode accept ! negation. Distance accepts exact values and ranges such as 0..50, ..16 and 10..; dx/dy/dz define a box from the selector origin. Selector-aware tab completion offers argument keys and context-specific values.

/tphere (aliases /here and /s) now accepts any number of player names and selectors and teleports their de-duplicated union to the sender. With no targets, it brings the sender's active /tppet and /tpmob selections to the sender, or performs a harmless self teleport when no selection is armed.

/there (alias /tpthere) ray-traces up to 128 blocks and sends the named/selected targets to a standing position beside the block being looked at. With no arguments it sends active pet/mob selections, or the sender when none are selected.

New nodes default to operators:

PermissionGrants
allium.tpthere/there and /tpthere
allium.selectorsSelector use in supported Allium commands
allium.command.selector.all@a
allium.command.selector.entities@e

Selected pets and mobs now travel through one shared, Folia-safe path whenever their owner teleports. The selection is atomically claimed before movement, preventing duplicate teleports and duplicate “auto-disabled” messages when more than one teleport event represents the same move.

Chat delivery and message deletion

Allium's channel manager broadcasts manually, but it previously discarded the modern chat event's recipients and did not stop when another plugin cancelled the event. That could bypass soft mutes, ignore lists and range-chat filtering. It now snapshots the remaining player viewers, intersects them with the channel's readers, clears the event viewers only to suppress the vanilla duplicate, and sends exclusively to that intersection. Cancelled chat is not rebroadcast.

Every rendered message now registers a short-lived logical ID before its per-viewer packets are captured. All copies inherit that ID, including copies created during a packet resend, so one /delmsg removes the original and every recipient-specific copy. Lookup prefers the original record so sender and timestamp information remain correct.

Discord-to-game channel messages resolve Nexo's configured glyph placeholders before sending. The in-game component gets Nexo's glyph character and styling, while the console keeps the readable placeholder/emoji. The integration is reflective and cached; absent or unsupported Nexo versions leave the message unchanged rather than preventing delivery.

Permissions, Folia and operational fixes

  • Plugin Brigadier commands honor their explicit permission node. When a command exposes a Bukkit permission, that check now wins over a Brigadier predicate that only asks for an op level. This extends the v0.2.9 vanilla-command fix to plugin command wrappers.
  • WorldEdit-style double-slash commands resolve. Commands registered internally as /pos1 or worldedit:/pos1 are retried with their leading slash restored after parsing //pos1.
  • Folia tasks really stop. Paper returns package-private scheduled-task implementations; reflecting cancel() from that implementation could throw an access error and leave a repeating task alive. Allium now resolves the public ScheduledTask interface method, caches it, and only latches the handle as cancelled after invocation succeeds.
  • No duplicate raw command usage. Allium commands already send localized usage and errors. Executors are now wrapped so Bukkit does not add the plain-white usage: string when a handler returns false.
  • No Java translation probe for Bedrock clients. Floodgate players are detected through its API, with the UUID marker as a fallback, and skipped before ModGuard opens its Java-only probe UI.
  • Quieter Citizens tracking. The waypoint-range scan runs four times per second but now logs only when the tracked NPC set changes, an attribute actually needs correction or the failure changes.

Verification

The full Maven test suite passes with 139 tests. New coverage includes the rendered animation seam, TAB/Bukkit writer ownership, stale visibility-transition invalidation, tab-entry relisting, stored-item round trips and editable metadata, Harvest interaction/regrowth parsing, randomized timing and offline catch-up, liquid defaults, and command-permission precedence.

Файлы

Allium.jar(4.74 MiB)
Основной
Скачать

Метаданные

Канал релиза

Release

Номер версии

0.2.11a

Загрузчики

Bukkit
Folia
Paper
Purpur
Spigot

Версии игры

1.20–26.2

Загрузок

5

Дата публикации

01.08.2026

Загрузил

ID версии

Главная