Repository navigation
Changelog
简体中文 | English
This page answers the two questions a server owner actually has: what changed in this version, and which setting do I need to touch when I upgrade. For setup steps see Installation; for the full meaning of any single key, see the page for that feature.
| Version | In one line | Upgrade effort |
|---|---|---|
| 1.4.0 | Stability pass: protection plugins now see mob mining, pickup stops eating valuables, reload reaches mobs that are already spawned | Swap the jar; two old edge values now behave differently |
| 1.3.0 | New: the plugin tells you when a newer release is published | Swap the jar, change no settings |
| 1.2.1 | Fixes "fails to load on first start on Paper / Purpur 26.2 and similar"; one jar now loads on 1.21.8 ~ 26.x | Swap the jar, change no settings |
| 1.2.0 | Two new config files (message.yml, equip.yml), player chase priority, mining under itself and mining the ceiling; plus a batch of mining and bridging feel fixes |
Align 4 defaults by hand — see below |
If you just want it running: do the 1.2.1 swap first, then come back to the 1.2.0 defaults table.
Upgrade advice: replace the jar and restart. No setting has to change — but two edge values you may have written earlier now mean what you expected (see the bottom of this section).
| Change | What it means for you |
|---|---|
| Protection plugins finally see mob mining | Every block a mob breaks is now announced to Bukkit's block-break event, so WorldGuard, CoreProtect, claim plugins and BlockLocker can see it — and refuse it. Before, the block simply vanished behind their back. |
| Pickup only takes blocks the backpack will use | It used to pick up diamond blocks and netherite blocks too; the stock is cleaned up after 15 seconds, so those items were destroyed. Now only blocks listed in placement.yml → entries are picked up. |
/mobinteract reload reaches mobs that are already spawned |
After a reload, mobs already in the world re-roll their birth equipment and stock with the new settings. No restart needed. The trade-off: the stock they are carrying at that moment is re-rolled as well. |
- A long chase no longer stops building halfway and never recovers.
- Walking far away and coming back no longer hands the mob a fresh stock of free blocks.
- Placed blocks no longer stay forever by accident, and one mob's cleanup can no longer remove an unrelated batch of blocks elsewhere.
- TNT and water can no longer be used to break into a protected area from one block outside it.
- A player standing where the mob wants to place a block no longer gets walled in.
- The update notice no longer repeats every 6 hours for the same release, and tags such as
1.4.0+build.7are no longer treated as "newer forever". -
/mobinteract inspectno longer prints an error when the mob you are looking at stands in another region. - Rewriting a list in
message.ymlnow actually overrides the built-in text;&A/&Rin colour codes work.
| Key | Before | Now |
|---|---|---|
break-time.hard-cap-seconds |
0 was clamped to 0.05 s, i.e. nothing was mineable |
0 (or a negative number) means no cap
|
placement.block-lifetime-seconds |
A negative number became 0, i.e. forever |
A negative number becomes 1 s; 0 still means forever |
backpack.chance |
65 was clamped to 1.0, i.e. every mob |
65 is read as 65% (and logged once) |
Upgrade advice: replace the jar and restart. A new
update.ymlis written on first start, with comments; nothing else changes.
| What you get | Details |
|---|---|
| The plugin tells you about new versions | 60 seconds after start, then once every 6 hours, it asks GitHub Releases for the newest published release and compares that tag with its own version |
| Three places it tells you | One line in the console, an in-game message to online players holding mobinteract.admin, and a reminder when an admin first joins after each restart |
/mobinteract update |
Runs the same check right now and prints the result to whoever asked |
A new update.yml
|
On/off switch, which repository to ask, first delay, interval, console notice, admin notice, join notice, whether to count pre-releases, request timeout, debug |
| Nothing gets downloaded | It only reports the version number and links to the release page; upgrading is still "swap the jar" |
Practical notes for a server owner:
-
update.ymlis a normal config file: change it, run/mobinteract reload, the new interval applies immediately. - Set
interval-hours: 0to check once per start instead of on a schedule; setenabled: falseto turn the whole thing off (no requests leave the server at all then). - The check needs the server to be able to reach
api.github.comover HTTPS. On a machine without outside access that check simply fails — quietly, logged only whendebug: true, and never as a red error that looks like a broken plugin. - Pre-releases are ignored by default, so a
-betatag does not nag you; flipinclude-prerelease: trueif you want them. - All player-facing texts live in
message.ymlunderupdate.*, so you can reword or translate them like any other message.
Upgrade advice: replace the jar and change nothing in your config. If you gave up on pre-26.3 servers because the plugin showed up red in
/plugins, it is worth trying again.
On Paper / Purpur 26.2 and similar servers, 1.2.0 failed at the very first start. The symptoms are easy to recognise:
- the console shows
Could not load plugin ... InvalidPluginException: Unsupported API version 26.3; - the plugin appears red and disabled in
/plugins; - a later manual PlugMan
loadonly returnsThat file is not a valid pluginorPlugin didn't load any plugin providers?.
The cause has nothing to do with your configuration: the API version declared inside the jar was hard-coded to 26.3, and the server rejects a declaration newer than itself during the startup scan, before it ever reads a config file.
1.2.1 declares api-version: 1.21.8 instead, so the same jar loads on 1.21.8 ~ 26.x. The minimum supported version is still 1.21.8 — older servers lack the pathfinding and scheduling capabilities the plugin relies on, and no setting can work around that.
| What you saw | Root cause, in server-owner terms | What happens now |
|---|---|---|
First start on Paper / Purpur 26.2 failed to load, reporting InvalidPluginException: Unsupported API version 26.3; red in /plugins; a later PlugMan load did not help either |
The API version declared in the jar was hard-coded to 26.3, so the server rejected a declaration newer than itself during the startup scan |
The declaration is now api-version: 1.21.8; one jar loads on 1.21.8 ~ 26.x. Minimum supported version: 1.21.8
|
| In the same failure, one code path called a pathfinding entry point that only newer servers (26.3) provide, which older servers do not have | That code assumed "every server has this new interface"; 1.21.8 does not | It now probes the server for the capability first and falls back to the older approach when it is missing, so both old and new servers work |
After the first mob failed to attach its behaviour, no mob behaved for the rest of the run; only /plugman reload brought it back (the tell-tale symptom: it works again after a reload) |
The plugin treated "this one attempt failed" (a transient situation such as a chunk unloading or an entity about to be removed) as "this server cannot take over mobs", latched that verdict permanently and stopped retrying | Only a server that genuinely does not support it is disabled permanently; a transient failure warns once in the console and later mobs keep being tried |
The console was flooded with debug lines starting with [diag]
|
Temporary logging left over from 1.2.0 debugging | Removed |
- Stop the server and overwrite the old jar with the 1.2.1 jar (the file name is unchanged).
- Start the server and confirm the plugin is green in
/plugins. - Run
/mobinteract statusonce and confirm it prints normally. - To prove mobs are really being taken over:
forceloadan area,summona mob, then check that the "known mob state" count in/mobinteract statusgoes up — a rising count means the behaviour attached successfully.
Config files, permissions and command syntax are unchanged in 1.2.1; your existing configs work as they are.
Upgrade advice: set
break-time.hard-cap-secondsto 180.0 andplacement.max-per-chaseto 32; if yourplacement.ymlstill has the oldblock-lifetime-seconds: 60, change it to 15.equip.ymlandmessage.ymlare generated automatically on first start — open them once and have a look.
| Item | What it means for you |
|---|---|
message.yml |
Every text sent to players (/mobinteract status / inspect / reload) is now yours to edit: & colour codes, {placeholders}, multi-line YAML lists. A missing key falls back to the built-in default, so deleting one never breaks anything. reload reloads it too and reports how many messages it read |
equip.yml |
The master gate for spawn equipment: chance defaults to 0.10, and worlds can override it per world name (case-insensitive). Inside the gate, tool.give.chance / backpack.chance split the share of "carries a pickaxe" versus "carries blocks" |
/mobinteract status |
A new "spawn equipment" line showing the effective chance and how many per-world overrides are in effect |
trigger.dig-below-self |
When the target is below and nearby, the mob mines the block under itself and drops down to keep chasing instead of waiting at the edge (on by default) |
trigger.ceiling-blocked |
When the ceiling blocks the way, the mob mines that block away first instead of repeatedly switching columns (on by default) |
debug |
Mining debug logging (off by default) — turn it on when investigating "why is this mob not mining" |
| Temporary-block renewal | When a temporary block expires and a creature is standing on it, it is renewed for a full cycle, so it no longer vanishes from under their feet |
targeting.yml |
Player chase priority: when a chaseable player is nearby, the target switches to the nearest player (within 16 blocks, checked every 10 ticks, never swapped back and forth while already chasing a player, line of sight optionally required) |
| BlockLocker compatibility | BlockLocker is detected automatically; chests / doors / trapdoors it protects are neither mined nor blown up, and the plugin waits for BlockLocker to be ready at startup |
pickup.only-equipped |
Only mobs that passed the spawn-equipment gate pick items up, keeping the combined share of "pickaxe + blocks" mobs at or under equip.chance
|
| Uninstall cleanup fallback | On uninstall / shutdown, blocks still awaiting cleanup are written to pending-blocks.txt before being deleted, and the next start cleans up again — even a hard kill leaves nothing permanent behind |
This is the only part of the upgrade that may need your hands. Upgrading never overwrites your existing config files: a value you explicitly wrote stays as written, and only keys still on the old default (or not present at all) run with the new default. The table below lists what a fresh install gets, and why it changed.
| Config | New default | Old default | Why |
|---|---|---|---|
break-time.multiplier |
4.0 | 2.0 | Halves the mining speed, so a mob no longer hollows out a wall as if it were on fast-forward |
break-time.hard-cap-seconds |
180.0 | 45 | The old value made the plugin give up on hard blocks such as obsidian, calling them "cannot be mined"; skipped materials produce one console notice |
placement.block-lifetime-seconds |
15 | 60 | Meant to pair with "renew while someone stands on it": blocks live briefly but never disappear when needed, leaving less litter in the world |
placement.max-per-chase |
32 | 10 | The old value made long bridges / tall pillars stop halfway; with config-version < 2 and a value of 10 it runs as 32 and warns in the console |
tool.give.chance / backpack.chance (built-in fallbacks) |
0.8 / 0.65 | — | Aligned with the bundled yml; only effective if you delete those keys |
One exception, stated plainly: placement.max-per-chase is the only value that changes behaviour on your behalf. If your placement.yml has config-version below 2 and max-per-chase is still the old default 10, the plugin runs with 32 and warns — because 10 is almost certainly an untouched leftover. Every other number you wrote yourself is respected.
| What you saw | Why it used to happen | Now |
|---|---|---|
| Long mining was cut off and restarted every 3 seconds, obsidian most of all | The "is mining stuck" timestamp was recorded once at the start and never refreshed as progress advanced, so a working job looked stuck | The check is refreshed as progress advances, so long jobs finish in one go |
| A block-breaking task was judged timed out the instant it was submitted, and the mob swung once and walked off | The value recording when the current break started was never filled in, so the timeout check was always true | The start time is recorded correctly and nothing times out instantly |
| Expired temporary blocks never disappeared, or their records were mysteriously lost | Expiry deleted the record before checking whether the chunk was loaded (so the deletion was wasted), and a failed sweep submission was never retried | An expiry table plus periodic sweeping plus retries — an expired block is always cleaned up |
| Mobs stood uselessly in front of a fence without mining | Obstacles ahead were only checked "one block diagonally", which misses the case of standing at a corner | Both horizontal axes are checked separately, so walls and corners are recognised |
| Mobs paved the ground while walking across flat terrain, leaving a trail of blocks | Any drop of up to 3 blocks counted as a gap worth bridging | Small drops are simply walked down; only deeper gaps get a bridge |
| With the ceiling blocked, mobs switched columns over and over without doing any work | There was no path for "mine the block above first" | With a pickaxe they mine that block away first; mining and placing are mutually exclusive, and the mob keeps staring at the target block while mining |
Far more mobs had spawn equipment than equip.chance allowed |
One code path handed out equipment without passing the master gate | The gate result is decided when the mob is taken over, and every path honours it afterwards |
| Two config keys changed nothing no matter what you set |
approach.start-distance / approach.timeout-ticks were read but never used by any behaviour |
Both keys are gone; leaving them in the file does nothing (you can delete them) |
-
equip.yml/message.ymlare created automatically on first start — do not create them by hand. To change wording, editmessage.ymland run/mobinteract reload. - An older
placement.ymlis recognised (config-versionbelow 2) and your file is not rewritten; the new defaults are only applied at runtime. - If you run BlockLocker, test it once after upgrading: send a mob at a protected chest and confirm it does not touch it.
- To make "mobs with pickaxes mining" rarer overall, lower
chanceinequip.yml(default 0.10). To make an individual mob work faster or slower, adjustbreak-time.multiplier(default 4.0 — higher is slower).
- Installation — install from scratch, back up before upgrading, where the configs live
-
Mining — every key in
mining.yml, pickaxe requirements, blacklists -
Placement — every key in
placement.yml, temporary blocks, bridges and pillaring -
Backpack and Pickup —
pickup.only-equippedand item filtering -
Equipment and Messages — the
equip.ymlgate andmessage.ymlwording -
Commands —
/mobinteract status/inspect/reload - FAQ — plugin shows red, mobs will not mine, blocks will not disappear
MobInteract · QQ 群 995974858 · Repository · Releases · Issues · English | 简体中文