Farming statistics
For crop presets and movement settings, see Farm crops.
Farming HUD and diagnostics
The larger left figure shows the higher available Bazaar or NPC hourly estimate, with its source in the label and the alternative beneath it. Bazaar means instant sell. BPS stays on the right. Rates use the last active minute after a 30-second warmup; startup shows a dash.
The blue area shows the selected market's recent rate. A dotted line marks the duration-weighted average of comparable completed runs lasting at least 60 active seconds. It appears only when priced history exists. The comparison stays fixed for the run; changing farm settings or valuation strategy separates comparisons. A valid zero-yield run contributes zero. Session value, crop count, Next Level N and the ETA to Farming 60 appear below. The duplicate profit footer is hidden.
Prices come from the shared Hexis cache and are fixed for each observed gain. Missing quotes show Unavailable independently for each market. These figures estimate the selected output form, not realized proceeds or net profit. See Track script earnings for valuation and history details.
Counts are inventory estimates in raw crop units. Known compacted forms are reconciled before crediting gains, so a conversion does not count twice. Sacks, transfers and unverified recipes cannot be reliably attributed. Flower counts include verified enchanted forms (160 raw units) and compacted forms (25,600 raw units). Estimated value is not a guaranteed sale price or net income after expenses. XP needs the server's visible skill data; missing progress shows a dash. ETAs need at least 30 seconds of XP evidence and a positive recent rate. They use your current progress and recent active-time rate, shown in seconds, minutes, hours or days. Missing XP history restarts the rate window. A visible level cap below 60 shows Unlock level cap; it does not pretend you can gain levels beyond that cap.
On a farming failure, the task releases input and saves bounded local evidence
to config/hexis/script-diagnostics/. The stop message includes its JSONL filename.
A native capture contains the terminal snapshot and recent movement/health
decisions, including position, section, pass and collision evidence. It does
not upload itself. Keep it when reporting a layout problem. If capture fails,
the original farming failure remains available. The folder rotates its oldest
JSONL captures once it reaches 32 files. Archive a capture you want to preserve.
For custom scripts and development tests, see Farming libraries and layout tests.
Blocks per second
The HUD shows a bold whole-number harvest average in BPS, using the configured averaging window (default ten seconds). Normal row switches and level changes contribute to the window. Warmup displays a neutral dash. During a turn, the reading uses a neutral color. Health checks run independently of the HUD.
Displayed BPS below 15 is red, 15–18 is yellow, and 19 or more is green. The reading and color change together after two updates confirm a new band. These are advisory bands for presets targeting about 20 direct breaks/second, not a guarantee for every layout. Values above 20 are not capped. Native snapshots also expose break counts and the average over the current harvest action.
The counter measures successful local vanilla block destruction. It does not count crosshair movement, Fortune item drops, or cascading sugar-cane blocks. It is not a server-confirmed yield counter: server corrections followed by a second local break can count again. Missing event history is marked incomplete.
A low-rate warning suggests checking aim, tool and crop coverage. Farming does not change your speed. Below the configured critical threshold (default 5 BPS), the separate critical-rate check stops the run once its complete harvesting window is ready.
Other scripts can reuse the counter:
local tracker = require("hexis/breaks").new({
block_ids = {"minecraft:carrots"},
window_seconds = 10,
})
local rate = tracker:update(true) -- false while paused or changing rows
-- rate.per_second is nil until the active window has warmed up.
-- rate.total counts direct local breaks; rate.session_complete flags gaps.
Each update also returns matched_breaks, observed_seconds, complete and
reset. These describe the latest batch; session_complete describes the full
session. Do not treat missing history or a reset as proof that harvesting stopped.
Call update regularly. The underlying
hexis.world.blocks.breaks({after = previous.cursor}) API also exposes individual
break events. Call it with {} first to establish a baseline. A changed world
resets the stream; overflow means the reader fell behind bounded history.