Repository navigation
Releases: Ninja6-MC/AntiSpeedrun
Releases · Ninja6-MC/AntiSpeedrun
Release list
AntiSpeedrun v0.2.0
Added
config.ymlcarries aconfig-version(1). On start and on/asr reloadan older file, including the unversioned v0.1.x shape, is migrated forward: missing keys are added with their shipped off defaults, comments are kept, and the old file is saved tobackups/first. The upgrade from the unversioned shape also setsanti-cheese.block-bed-anchor-boss-damage,block-exit-portal-crystal-placeandblock-gateway-pre-dragonfromtruetofalse, once, with a WARNING per key: v0.1.x shipped themtruewithout enforcing them, sofalsekeeps what the server did. Set one back totrueto turn it on. No other value is changed. A newer or unreadable version stops startup with the file untouched. State files are not versioned yet.anti-cheese.block-bed-anchor-boss-damage, off by default, cancels bed and Respawn Anchor explosion damage to the Ender Dragon (including its parts) and the Wither, detected byDamageType.BAD_RESPAWN_POINT. TNT, arrows and melee are not affected. Its shipped default changes fromtruetofalse; it was parsed only until now.anti-cheese.block-exit-portal-crystal-place, off by default, refuses an End Crystal placed on the exit portal's centre column. The four resummon ritual positions are not affected. Its shipped default changes fromtruetofalse; it was parsed only until now.anti-cheese.cap-single-hit-boss-damage, off by default, enforces
max-single-hit-boss-damageagainst the Ender Dragon and the Wither. The cap applies to final
damage after armour and resistance, including hits on the dragon's parts, so stacked TNT
minecarts and Mace smashes cannot skip the fight.- Outer-End boundary (
anti-cheese.block-gateway-pre-dragon,outer-end-radius,outer-end-poll-seconds) holds players within the radius until the world's first dragon is killed. It is off by default, including in every bundled profile.
Upgrading from 0.1.x
- Every new anti-cheese rule ships off. Enable the ones you want in
config.ymlunder
anti-cheese, then run/asr reload. - On first start the config migration adds
config-version: 1, saves the old file to
plugins/AntiSpeedrun/backups/, and switchesblock-gateway-pre-dragon,
block-exit-portal-crystal-placeandblock-bed-anchor-boss-damagefromtrueto
false, once, because in 0.1.x they did nothing. Set one back totrueto enforce it. - A clean install also works: back up
plugins/AntiSpeedrun/andplayerdata, delete
config.yml, install the jar and restart. Deletingconfig.ymlloses every local edit
and any preset applied with/asr profile apply; the regenerated file is the default
SMP_STANDARD. State files carry over.
AntiSpeedrun v0.1.1
Fixed
- Journey Guide Book delivery on first join and through
/journeybookor/asr book
no longer fails with aNoSuchMethodErroron Paper 26.2. The compatible Paper
1.21.4 API baseline is retained.
AntiSpeedrun v0.1.0
Added
- Resummoned dragon fights keep the exit portal sealed in its bedrock basin until
victory, with a configurable inactivity escape. Repeat victories award a
configurable Dragon Egg trophy, and each dragon can drop a Dragon Head. boss-scaling.multi-dragon.balanced-xpnow awards 1,000 XP per extra dragon when enabled.
Turning it off retains the previous 500 XP cap. The original dragon keeps vanilla's
first-kill or resummon reward, anddoMobLootstill prevents XP drops.boss-scaling.scale-resummoned-dragons, which until now was parsed and read by nothing, scales
fights resummoned with four End crystals. The resummoned dragon opens its own
battle-prep-secondswindow when it appears, and the party on the main island is counted and
reinforced exactly as for the first fight./summon, spawn eggs and other plugins' dragons do not
open one.boss-scaling.multi-dragon.rounding-mode, which until now was parsed and read by nothing, sets
how the party'splayers * multiplierrounds to a dragon count:HALF_UP(the default),CEIL
orFLOOR. The product is exact, so10 * 0.7is seven underCEIL. A party of one still
fights one dragon under every mode, and an unknown mode warns and falls back toHALF_UP.- One victory for a multi-dragon fight. The original Ender Dragon cannot die while an extra dragon
lives, so the exit portal, the egg, the 12,000 XP award and the "dragon killed" flag wait for the
last dragon. Extra dragons do not heal from End crystals. A resolved
reinforcement window is recorded indragon-fights.yml, so a restart mid-fight no longer spawns
a second set of extra dragons. - The multi-dragon reinforcement window. The first player to enter an End whose dragon has never
been killed starts aboss-scaling.battle-prep-secondscountdown, shown to everyone in the End;
the dragon fights from the start, so a solo player is never kept waiting. When it ends, survival
and adventure players within 300 blocks of the centre are counted and the extra dragons the
party earns undermulti-dragon.multiplierandmax-dragonsspawn above the main island.
Resummoned fights can now lock their existing exit portal. - Handing a tier-gated item to an Allay, or taking one back from it, is refused for a player who
has not earned the tier. Allays collecting and delivering items on their own are unaffected, so
sorters keep working. Bottling Dragon's Breath is refused until the player meets the End gate's
requirement; it followsdimension-gates.the-end.enabledand is waived by the End waivers and
the item bypass. Mobs picking up items are not gated. - Taking a tier-gated item off an armor stand or out of an item frame is refused for a player who
has not earned the tier. Swapping an item onto an armor stand slot that holds a gated piece counts
as taking it, and a framed item knocked out by the player's punch or projectile stays in the frame.
Placing items and rotating a framed item are unaffected. Followsitem-progression.enabled, the
tier table and the item bypass. item-progression.gate-nested-bundles, which until now was parsed and read by nothing, gates
bundle contents. Taking an item out of a bundle is refused while the bundle holds a stack the
player has not earned, wherever the bundle sits: in a container, or in the player's own hotbar,
main inventory or off hand. Using such a bundle in either hand to spray its contents onto the
ground is refused too, without blocking the block that was clicked. Every stack in the bundle is
checked, because the item the client selects is not visible to the server, so a bundle holding
only ungated or earned items is untouched. Shulker box contents were already covered: a placed
shulker box is a container like any other.- A dispenser firing tier-gated armour onto a player who has not earned that tier is now cancelled, so
the armour stays in the dispenser and the player gets the usual item-gate rejection line. It follows
item-progression.gate-dispensers(default on),item-progression.enabled, the tier table and the item bypass, and only players are gated. anti-cheese.block-early-eye-throwing, which until now was parsed and read by nothing, refuses an
Eye of Ender throw until the player has earnedminecraft:nether/find_fortress. The item use is
denied at the interaction, so the eye stays in the hand and no Eye of Ender entity spawns; setting
an eye into an empty End Portal frame is not a throw and is left alone. Waived by
antispeedrun.bypass.anticheese, an/asr bypassgrant, or/asr unlock the_end. The refusal
line is the newanti-cheese.early-eye-rejection-message, validated as MiniMessage at load like
every other rejection message.- The Journey Guide Book.
/journeybook(alias/rulesbook) and/asr bookhand the player a
written book generated from the live configuration: the dimension gates and what each requires,
the item tiers with their hints, and the Eye of Ender and Mending rules while they are on.
Vanilla advancements are named by their in-game titles in the reader's own language. With
journey-book.give-on-first-joinon, a player who has never received the book is given one a
tick after joining — including players who joined before the plugin was installed, since
delivery is decided by the plugin's own persisted flag rather thanhasPlayedBefore(). Both
spellings of the command are gated onantispeedrun.bookand refuse while the player already
carries a copy or has no room for one. - Brand vector master (
docs/assets/icon-master.svg) and automated multi-resolution icon suite
(scripts/export-icons.mjs) featuring the Progression Crown and Tri-Realm Apex, with CI drift
gate enforcement (.github/workflows/icons.yml). /progress, and/asr progresswhich delegates to it, both gated onantispeedrun.progress
(defaulttrue). It draws the player their own progression card: every dimension gate in
configured order with a completed, in-progress or locked mark, what each one is still waiting on,
and a highlightedNEXT STEPline. That next step is the same string the idle reminder puts in
{NEXT_STEP}— one implementation, so the two cannot drift apart and tell a player different
things. The newprogress-card.simple-cardsetting chooses the shape:AUTO(the default) draws
a plain-ASCII card for a Bedrock client and the full one for a Java client, andALWAYSand
NEVERforce one or the other. Bedrock's font carries none of the marks the full card uses, so
without this a Geyser player saw a column of replacement boxes; the plain card is asserted
character by character rather than described as "renders cleanly".AUTOrecognises a Bedrock
client only on a server actually running Floodgate, which stays asoftdepend— nothing here
compiles against it. Milestone display names and advancement keys read fromconfig.ymlreach
the player as text, never as markup.- Idle reminders, implementing the
idle-remindersection, which until now was parsed and read by
nothing. A player who stands still forstand-still-secondsis shown their next progression goal
on the action bar, as a title, or in chat, at most once percooldown-minutes. Standing still is
detected by a poll on the player's own region scheduler, one per player and only while the feature
is enabled — there is noPlayerMoveEventhandler anywhere in the plugin and no global tick loop,
and a build that introduces either fails the test suite. An action bar reminder is re-sent while it
is up so thatdisplay-duration-secondsis honoured past the client's own three-second fade. A
player who has cleared every gate is told nothing. - Item tier gates are now enforced. The compiled
item-progression.gated-itemstable was
previously built on every reload and read by nothing; three channels now consult it. A player who
has not met a tier's requirements cannot pick a gated item up off the ground, take one out of a
container by an ordinary, shift, hotbar-swap, off-hand-swap, double-click-gather or drop click,
or buy one from a villager or wandering trader. The gate is waived by
antispeedrun.bypass.items, by an unexpired/asr bypassgrant, or by setting
item-progression.enabled: false. Putting gated items into a container is never blocked,
including onto a slot that already holds a matching stack, and neither is moving them around
inside your own inventory — dragging included, since a drag only moves items out of the cursor
and the clicks that would load the cursor from a container are refused. Views that hand a
player's own item straight back — the crafting grid, a crafting table, and the anvil, smithing
table, grindstone, enchanting table, cartography table, loom and stonecutter — are untouched;
furnaces, brewing stands, Crafters and storage blocks are containers and are gated. villager-progression.gate-mending-tradeis now enforced. With it switched on, a player who has
not earnedvillager-progression.required-advancement(Zombie Doctor by default) cannot select a
villager or wandering trader offer whose result carries Mending, and cannot take that result out
of the merchant window if an offer was already selected when they filled the ingredient slots.
The gate is keyed on the enchantment, so a Mending book is told apart from any other enchanted
book — something the material-keyed item tier table cannot do — and it reads both an item's
ordinary and its stored enchantments, so an already-enchanted tool offered by a datapack or a
plugin merchant is covered as well as a librarian's book. It is off by default, costs nothing on
the trade path while it is off, and is waived byantispeedrun.bypass.itemsor an unexpired
/asr bypassgrant. A result that is both above its item tier and enchanted with Mending is
refused once, not twice. The refusal is worded by `vi...