readme: restyle to match minecraft-launcher format
Some checks failed
Build / build (push) Has been cancelled

Centered hero header with chunky black Download badge, small chip
badges below, em-dash tagline, single-line nav row. Sections trimmed,
license collapsed to <sub> footer line. Same visual language as
s8n-ru/minecraft-launcher README.
This commit is contained in:
s8n-ru 2026-05-05 05:09:34 +01:00
parent a5bd58c577
commit b6863806cd

164
README.md
View file

@ -1,133 +1,103 @@
# Auth-Limbo <div align="center">
# auth-limbo
<br>
<a href="https://github.com/s8n-ru/auth-limbo/releases/latest">
<img src="https://img.shields.io/badge/Download_.jar-black?style=for-the-badge&logoColor=white&labelColor=black&color=white" height="60" alt="Download latest jar">
</a>
<br><br>
[![Paper](https://img.shields.io/badge/Paper-1.21.11+-black?style=flat-square&logo=papermc&logoColor=white)](https://papermc.io/)
[![Java](https://img.shields.io/badge/Java-21+-black?style=flat-square&logo=openjdk&logoColor=white)](https://adoptium.net/)
[![Build](https://github.com/s8n-ru/auth-limbo/actions/workflows/build.yml/badge.svg)](https://github.com/s8n-ru/auth-limbo/actions/workflows/build.yml) [![Build](https://github.com/s8n-ru/auth-limbo/actions/workflows/build.yml/badge.svg)](https://github.com/s8n-ru/auth-limbo/actions/workflows/build.yml)
[![License: AGPL--3.0](https://img.shields.io/badge/license-AGPL--3.0-lightgrey.svg)](LICENSE)
[![Paper](https://img.shields.io/badge/Paper-1.21.11%2B-lightgrey.svg)](https://papermc.io/)
[![Java](https://img.shields.io/badge/Java-21%2B-lightgrey.svg)](https://adoptium.net/)
A small Paper plugin I wrote because AuthMe's post-login teleport kept
dumping my players at world spawn instead of where they last were.
Tried every config flag, removed Multiverse, tried forks. Nothing
fixed it. So this does.
Two jobs: hosts a void `auth_limbo` world (so I could stop running
Multiverse-Core for one world I never visited) and replaces AuthMe's
broken post-login teleport with one that actually works.
--- ---
## The problem a small paper plugin - ***fixes AuthMe's broken post-login teleport***
Friend logs in, types `/login`, AuthMe is supposed to teleport them built for my server, runs there daily.
back to where they were. They land at world spawn instead. Every
time.
Spent a day chasing this. Disabled Multiverse-Core. Disabled GrimAC. ---
Disabled UnexpectedSpawn. Disabled Essentials. Even ran with just
AuthMe loaded and the bug stayed.
Eventually traced it to [Issues](../../issues) · [Releases](../../releases)
[PaperMC/Paper#4085](https://github.com/PaperMC/Paper/issues/4085) —
`Player#teleportAsync` resolves before the destination chunk loads,
Paper's safety logic snaps the player to the nearest loaded chunk,
and that chunk is world spawn. AuthMe's `teleportOnLogin` flow walks
right into it.
Filed a mental bug report against AuthMe, decided writing my own </div>
listener was faster than waiting on a fork.
--- ---
## What it does ## What it does
Two things and that's it. Two things.
1. **Void `auth_limbo` world.** A custom `ChunkGenerator` produces 1. **Void `auth_limbo` world.** Custom `ChunkGenerator`, 5x5 barrier
empty chunks. A 5x5 barrier platform sits under spawn so unauth platform under spawn. AuthMe uses it as pre-auth limbo. No
players don't fall forever. No daylight cycle, no weather, no mob Multiverse-Core required.
spawning, no PvP. AuthMe uses it as the pre-auth limbo. No 2. **Restore-teleport that actually works.** `LoginEvent` listener at
Multiverse-Core needed. `MONITOR` priority reads quit-location from `plugins/AuthMe/authme.db`,
pins destination chunk via `addPluginChunkTicket`, chains
`getChunkAtAsyncUrgently` into `teleportAsync`. No spawn-snap.
2. **Authoritative restore-teleport.** A `LoginEvent` listener at Bug background: [PaperMC/Paper#4085](https://github.com/PaperMC/Paper/issues/4085).
`MONITOR` priority fires *after* AuthMe's broken teleport, reads
the saved quit-location straight out of
`plugins/AuthMe/authme.db`, pins the destination chunk with
`Chunk#addPluginChunkTicket`, then chains
`World#getChunkAtAsyncUrgently` into an authoritative
`Player#teleportAsync`. Same pattern
[PaperLib's `AsyncTeleportPaper`](https://github.com/PaperMC/PaperLib)
uses, just narrower.
That's the whole surface area. No password handling, no permissions
beyond admin commands, no register flow, no chat formatting. AuthMe
owns all of that.
--- ---
## Install ## Install
1. Download `AuthLimbo-1.0.0.jar` from the 1. Download `AuthLimbo-1.0.0.jar` from [Releases](https://github.com/s8n-ru/auth-limbo/releases).
[Releases page](https://github.com/s8n-ru/auth-limbo/releases). 2. Drop in `plugins/`.
2. Drop it in your `plugins/` directory. 3. Restart server. Don't `/reload`.
3. Restart the server. Don't `/reload` — it'll break things. Just
restart.
AuthMe-ReReloaded is a **hard dependency**. The plugin refuses to Hard dep: **AuthMe-ReReloaded**. Plugin refuses to load without it.
load without it.
For the `itzg/minecraft-server` Docker image, see For `itzg/minecraft-server` Docker image, see [`docs/installation.md`](docs/installation.md).
[`docs/installation.md`](docs/installation.md) for the `PLUGINS:`
environment-variable form.
--- ---
## Configuration ## Config
Defaults work. `plugins/AuthLimbo/config.yml` is created on first Defaults work. `plugins/AuthLimbo/config.yml` on first start:
start. If you want to tweak:
```yaml ```yaml
limbo: limbo:
world: auth_limbo # Bukkit world name world: auth_limbo
spawn-x: 0.5 spawn-x: 0.5
spawn-y: 128.0 spawn-y: 128.0
spawn-z: 0.5 spawn-z: 0.5
build-platform: true # 5x5 barrier under spawn build-platform: true
platform-y: 127 platform-y: 127
authme: authme:
db-path: plugins/AuthMe/authme.db db-path: plugins/AuthMe/authme.db
teleport-delay-ticks: 10 # ticks to wait after LoginEvent teleport-delay-ticks: 10
preload-chunks: true # forceload chunk before teleport preload-chunks: true
debug: false
debug: false # verbose logging
``` ```
Full reference in [`docs/configuration.md`](docs/configuration.md). Full reference: [`docs/configuration.md`](docs/configuration.md).
--- ---
## Commands ## Commands
| Command | Permission | Effect | | Command | Permission | Effect |
|----------------------------|---------------------|-----------------------------------------------------| |---|---|---|
| `/authlimbo reload` | `authlimbo.admin` | Reload `config.yml`. | | `/authlimbo reload` | `authlimbo.admin` | Reload `config.yml`. |
| `/authlimbo tp <player>` | `authlimbo.admin` | Manually teleport a player to their saved location. | | `/authlimbo tp <player>` | `authlimbo.admin` | Teleport player to saved location. |
Aliases: `/alimbo`. Alias: `/alimbo`.
--- ---
## What I tested ## Tested
| Component | Status | Notes | | Component | Status |
|-----------------------------------|----------|----------------------------------------| |---|---|
| Paper 1.21.11 | Yes | Primary target. | | Paper 1.21.11 | Yes |
| Purpur 1.21.11 | Yes | Same Paper API surface. | | Purpur 1.21.11 | Yes |
| Folia | Unknown | Untested. Login event threading may differ. | | Folia | Untested — login event threading may differ |
| AuthMe-ReReloaded (HaHaWTH b49) | Yes | Verified on production. | | AuthMe-ReReloaded (HaHaWTH b49) | Yes |
| AuthMe-ReReloaded other 5.x forks | Untested | Schema is the same, should work. | | AuthMe-ReReloaded other 5.x forks | Untested — schema same, should work |
| Multiverse-Core | Untested | Not required. Possible teleport-intercept conflict — see [`docs/compatibility.md`](docs/compatibility.md). | | Multiverse-Core | Untested — possible teleport-intercept conflict, see [`docs/compatibility.md`](docs/compatibility.md) |
--- ---
@ -138,35 +108,11 @@ mvn clean package
``` ```
Shaded jar lands at `target/AuthLimbo-1.0.0.jar`. Java 21, Maven 3.9. Shaded jar lands at `target/AuthLimbo-1.0.0.jar`. Java 21, Maven 3.9.
Standard. The `lib/AuthMe-5.6.0-FORK-Universal.jar` is referenced as `lib/AuthMe-5.6.0-FORK-Universal.jar` is `system`-scope so build
a `system`-scope dep so the build doesn't need any private repo needs no private repo credentials.
credentials.
CI builds via [GitHub Actions](.github/workflows/build.yml) on every tag.
--- ---
## Why not just use Multiverse-Core for the void world? <sub>[AGPL-3.0](LICENSE) — modified network-deployed builds must offer source per §13. Built by [s8n-ru](https://github.com/s8n-ru).</sub>
Multiverse-Core does a dozen things. I needed one void world. Also
Multiverse intercepts teleports for portals and respawn, which is the
exact contention I was running from. This plugin is ~400 lines and
only manages the one world AuthMe needs. If you already run
Multiverse for legit reasons, ignore the limbo manager and just use
the teleport fix.
---
## License
AGPL-3.0. See [`LICENSE`](LICENSE).
If you run a modified version of this plugin on a Minecraft server
that players connect to over the network, AGPLv3 §13 requires you to
offer the modified source to those players. Unmodified use carries
no obligation beyond GPLv3 (no source-sharing required).
---
## Author
Built by [s8n-ru](https://github.com/s8n-ru). If this fixes your
headache too, cool. If not, file an issue, I'll look.