diff --git a/README.md b/README.md
index fc64edf..58ceca5 100644
--- a/README.md
+++ b/README.md
@@ -62,8 +62,8 @@ blocks and is never left behind when OneBlock reuses an island.
## Arriving players
- **Lobby gate.** The lobby world's gate to the station stands by the lobby, not by the world's spawn, in its own design: a
- wide arch on two lantern posts. With [Latchkey](https://github.com/ExtantApe/Latchkey) 0.3.0 its lobby is used,
- read by name, so Latchkey stays optional. Otherwise set `arrival.lobby-world`. Move the lobby and the gate follows.
+ wide arch on two lantern posts. With [WelcomeWagon](https://github.com/ExtantApe/WelcomeWagon) 0.3.0 its lobby is used,
+ read by name, so WelcomeWagon stays optional. Otherwise set `arrival.lobby-world`. Move the lobby and the gate follows.
- **Welcome.** Walking into the station the first time, or after 30 days away, you get three short lines saying how many
worlds and platforms you can reach. The time of your last visit is kept on your player file and shown to nobody else.
- **Departures Board.** In front of the centrepiece. Each player sees their own: only the worlds they can use, grouped
diff --git a/build.gradle.kts b/build.gradle.kts
index 52c5207..6568fed 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -4,7 +4,7 @@ plugins {
}
group = "com.extantape"
-version = "0.7.1"
+version = "0.7.2"
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(25))
diff --git a/docs/decisions.md b/docs/decisions.md
index 9eb5dd0..326930f 100644
--- a/docs/decisions.md
+++ b/docs/decisions.md
@@ -23,3 +23,7 @@ Dates are when the decision was made. Those marked "by" were made while the firs
| by 2026-11-07 | Gradle with Kotlin DSL, group `com.extantape`, built like BlueMapHUD. Repo and jar named `Waystation`. |
| by 2026-11-07 | One jar, readable source. No economy plugin of its own, no database, no client mod. Money goes through Vault when it's there. |
| by 2026-11-07 | No dependency on Multiverse-Portals. Inventories must never be lost or mixed. Admin rights come from permissions (LuckPerms), not from being an operator. |
+
+## 2026-11-14
+
+- **Other plugins' new names (owner, D194, D196, D197, D198):** Waystation reads WelcomeWagon's lobby and arrival event by their new names, and its docs and tests use OneVoid, Mayor, Sheriff and the other new names. Waystation itself keeps its name until the Waycave rebuild (K649), as the owner chose. Released as 0.7.2.
diff --git a/docs/test-audit.md b/docs/test-audit.md
index e6c8865..becdde6 100644
--- a/docs/test-audit.md
+++ b/docs/test-audit.md
@@ -61,7 +61,7 @@ Overkill: `ReturnCommandTest.everyReturnMessageTheCodeUsesIsInTheShippedConfig`
| No usable key means nobody gets in and nobody is sent | unit `withoutAUsableKeyNobodyGetsIn`, `theKeyFileMustBeLongEnoughAndPrivate` (and a key problem never prints the key) |
| A pass is spent on the client once used | bots "B overwrites the pass on the client" |
| A fargate sends nobody to a server that doesn't answer, and says so | bots "with B down, nobody is transferred", "and they are told, kindly" |
-| A teleport or respawn that lands a player at a gate can't let the gate take them on their first step | bots "walking straight in from where a teleport put them does nothing", with the control once they've stepped clear; Voidwell's suite plays Multiverse-Inventories' last-location teleport |
+| A teleport or respawn that lands a player at a gate can't let the gate take them on their first step | bots "walking straight in from where a teleport put them does nothing", with the control once they've stepped clear; OneVoid's suite plays Multiverse-Inventories' last-location teleport |
| Paper-only servers don't try to build a station every 30 seconds | by reading: `Station.sync` returns before `generate` without Multiverse-Core (no bot check: the return suite runs Paper-only and showed no such warning) |
Acceptance on the stand-in: 153/161, the same 8 as 0.6.0. One check ("op in creative can't break the station floor") read the bot's own view after a refused dig and failed once; it now asks the server, and passes.
@@ -82,7 +82,7 @@ Acceptance on the stand-in: 153/161, the same 8 as 0.6.0. One check ("op in crea
| A plugin's veto event stops a gate | `acceptance` "plugin event hook vetoes the gate" |
| The hand-over to a world's own plugin | `handover` 28/28 on 26.1.2 |
-`test/prepare-small.mjs` now adds Vault or VaultUnlocked to the stand-in when the jar folder has one. Results on Paper 26.1.2: `acceptance` 153/161, with the OneBlock section skipped. The 8 failures are exactly the stand-in list below (the real server's set-up, BlueMap's first render, the flaky op check, and the two crash checks after the OneBlock section). `arrival` passes 39/39 on 26.1.2 with Latchkey 0.3.0, the 10 `--json` checks included.
+`test/prepare-small.mjs` now adds Vault or VaultUnlocked to the stand-in when the jar folder has one. Results on Paper 26.1.2: `acceptance` 153/161, with the OneBlock section skipped. The 8 failures are exactly the stand-in list below (the real server's set-up, BlueMap's first render, the flaky op check, and the two crash checks after the OneBlock section). `arrival` passes 39/39 on 26.1.2 with WelcomeWagon 0.3.0, the 10 `--json` checks included.
**Still open:** walking through gates and fargates on 26.3 (bots are disconnected when they move there; the newest ViaVersion builds were checked on 2026-11-10), and everything on the real-client list.
@@ -92,9 +92,9 @@ Covers what the arrival flow adds, and the first run of the older suites since t
| Promise | Proved by |
| --- | --- |
-| The lobby world's return gate stands by the lobby, not by the world's spawn, with the lobby label, leading to the station | `arrival`, without Latchkey (config lobby) and with Latchkey (its lobby). `ArrivalTest` |
-| Latchkey's lobby wins over Waystation's own setting, and Latchkey stays optional, read by name | `arrival`: "found Latchkey's lobby by name", "gives way to it"; the run without Latchkey |
-| When the lobby moves (config and reload, or Latchkey's lobby and the next arrival), the gate is placed again by the new spot | `arrival`, both runs. `ArrivalTest.whenTheLobbyGateIsPlacedAgain` |
+| The lobby world's return gate stands by the lobby, not by the world's spawn, with the lobby label, leading to the station | `arrival`, without WelcomeWagon (config lobby) and with WelcomeWagon (its lobby). `ArrivalTest` |
+| WelcomeWagon's lobby wins over Waystation's own setting, and WelcomeWagon stays optional, read by name | `arrival`: "found WelcomeWagon's lobby by name", "gives way to it"; the run without WelcomeWagon |
+| When the lobby moves (config and reload, or WelcomeWagon's lobby and the next arrival), the gate is placed again by the new spot | `arrival`, both runs. `ArrivalTest.whenTheLobbyGateIsPlacedAgain` |
| A gate placed as an ordinary return gate before the lobby was known is replaced | `ArrivalTest`. This was a real bug: a removed gate was never placed again until its world's "done" mark was cleared |
| The station welcome comes on a first visit, counts what that player can reach, and doesn't repeat on a quick return or a re-login | `arrival`. The 30-day gap: `ArrivalTest.aWelcomeIsDueOnTheFirstVisitAndAfterTheGap` |
| The Departures Board: one per player in the station, listing only the worlds that player can use, under their platform | `arrival`: two players with different access |
@@ -109,7 +109,7 @@ Covers what the arrival flow adds, and the first run of the older suites since t
| A reload redraws the board in the new settings (the label backing, for one) | `station`: "label-backing 0 keeps Minecraft's own background". It caught the board keeping its old plate until fixed |
| What per-player data is kept, and that none is shown to other players | `docs/decisions.md`, 2026-11-09 |
-`arrival` passes 29/29 on Paper 26.1.2, 26.2 and 26.3, with and without Latchkey 0.3.0. Unit tests: 31. How the board, the wall map and a sealed gate look, and whether the marker turns with you, need a real client (tests.md T12).
+`arrival` passes 29/29 on Paper 26.1.2, 26.2 and 26.3, with and without WelcomeWagon 0.3.0. Unit tests: 31. How the board, the wall map and a sealed gate look, and whether the marker turns with you, need a real client (tests.md T12).
### The older suites, on a small made-up copy
diff --git a/src/main/java/com/extantape/waystation/Arrival.java b/src/main/java/com/extantape/waystation/Arrival.java
index 20865d2..1b69a56 100644
--- a/src/main/java/com/extantape/waystation/Arrival.java
+++ b/src/main/java/com/extantape/waystation/Arrival.java
@@ -24,19 +24,19 @@
/**
* The arrival flow (plan phase 3, owner 2026-11-09): the lobby gate into the station, and a short welcome inside it.
*
- *
The lobby comes from Latchkey when it's installed and has one set up, otherwise from {@code arrival.lobby-world}.
- * Latchkey stays optional: Waystation doesn't build against it, and reads its {@code lobbyLocation()} method and its
- * {@code PlayerArrivedEvent} by name (crossing latchkey-waystation). If they don't match, it falls back to the config.
+ *
The lobby comes from WelcomeWagon when it's installed and has one set up, otherwise from {@code arrival.lobby-world}.
+ * WelcomeWagon stays optional: Waystation doesn't build against it, and reads its {@code lobbyLocation()} method and its
+ * {@code PlayerArrivedEvent} by name (crossing welcomewagon-waystation). If they don't match, it falls back to the config.
*/
final class Arrival implements Listener {
- static final String ARRIVED = "com.extantape.latchkey.api.PlayerArrivedEvent";
+ static final String ARRIVED = "com.extantape.welcomewagon.api.PlayerArrivedEvent";
/** Furthest a lobby gate may stand from the lobby before it's put back: the placement search radius, and a little. */
static final int LOBBY_REACH = 72;
private final WaystationPlugin plugin;
private final NamespacedKey seen;
- private Method latchkeyLobby;
- private Plugin latchkey;
+ private Method welcomewagonLobby;
+ private Plugin welcomewagon;
private Location lobby;
Arrival(WaystationPlugin plugin) {
@@ -44,13 +44,13 @@ final class Arrival implements Listener {
this.seen = new NamespacedKey(plugin, "station_seen");
}
- /** Finds Latchkey's lobby by name, if Latchkey is here. Called once, when every plugin has enabled. */
- void hookLatchkey() {
- Plugin lk = Bukkit.getPluginManager().getPlugin("Latchkey");
+ /** Finds WelcomeWagon's lobby by name, if WelcomeWagon is here. Called once, when every plugin has enabled. */
+ void hookWelcomeWagon() {
+ Plugin lk = Bukkit.getPluginManager().getPlugin("WelcomeWagon");
if (lk == null || !lk.isEnabled()) return;
try {
- latchkeyLobby = lk.getClass().getMethod("lobbyLocation");
- latchkey = lk;
+ welcomewagonLobby = lk.getClass().getMethod("lobbyLocation");
+ welcomewagon = lk;
Class extends Event> arrived = lk.getClass().getClassLoader().loadClass(ARRIVED).asSubclass(Event.class);
Method getLobby = arrived.getMethod("getLobby");
Bukkit.getPluginManager().registerEvent(arrived, this, EventPriority.MONITOR, (l, e) -> {
@@ -59,27 +59,27 @@ void hookLatchkey() {
Location at = (Location) getLobby.invoke(e);
if (!same(at, lobby)) refresh();
} catch (ReflectiveOperationException ex) {
- plugin.getLogger().log(Level.WARNING, "Couldn't read Latchkey's arrival event", ex);
+ plugin.getLogger().log(Level.WARNING, "Couldn't read WelcomeWagon's arrival event", ex);
}
}, plugin);
- plugin.getLogger().info("Using Latchkey's lobby for the lobby gate.");
+ plugin.getLogger().info("Using WelcomeWagon's lobby for the lobby gate.");
} catch (ReflectiveOperationException | ClassCastException e) {
- latchkeyLobby = null;
- plugin.getLogger().warning("Latchkey is installed but doesn't offer its lobby the way Waystation expects, so the lobby gate "
+ welcomewagonLobby = null;
+ plugin.getLogger().warning("WelcomeWagon is installed but doesn't offer its lobby the way Waystation expects, so the lobby gate "
+ "uses arrival.lobby-world instead. Update both plugins. (" + e.getClass().getSimpleName() + ")");
}
}
- /** Where the lobby is now: Latchkey's if it has one, else the configured world. Null for no lobby gate. */
+ /** Where the lobby is now: WelcomeWagon's if it has one, else the configured world. Null for no lobby gate. */
Location currentLobby() {
Settings.Arrival a = plugin.settings().arrival;
if (!a.lobbyGate()) return null;
- if (latchkeyLobby != null && latchkey.isEnabled()) {
+ if (welcomewagonLobby != null && welcomewagon.isEnabled()) {
try {
- Location at = (Location) latchkeyLobby.invoke(latchkey);
+ Location at = (Location) welcomewagonLobby.invoke(welcomewagon);
if (at != null) return at;
} catch (ReflectiveOperationException | RuntimeException e) {
- plugin.getLogger().log(Level.WARNING, "Couldn't ask Latchkey where the lobby is", e);
+ plugin.getLogger().log(Level.WARNING, "Couldn't ask WelcomeWagon where the lobby is", e);
}
}
if (a.lobbyWorld().isEmpty()) return null;
diff --git a/src/main/java/com/extantape/waystation/WaystationPlugin.java b/src/main/java/com/extantape/waystation/WaystationPlugin.java
index 538c69b..8b688db 100644
--- a/src/main/java/com/extantape/waystation/WaystationPlugin.java
+++ b/src/main/java/com/extantape/waystation/WaystationPlugin.java
@@ -116,7 +116,7 @@ public void onEnable() {
if (settings.exampleWorlds) makeExampleWorlds(firstStart);
station.ensureWorld();
Bukkit.getWorlds().forEach(renderer::sweep);
- arrival.hookLatchkey();
+ arrival.hookWelcomeWagon();
arrival.refresh();
station.sync(true);
Bukkit.getScheduler().runTaskTimer(this, renderer::pass, 20L, 20L);
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 5bc3a62..382f8bc 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -170,10 +170,10 @@ island-posts:
# Arriving players. The lobby gate leads from the lobby into the station. It's the lobby world's return
# gate, placed near the lobby instead of the world's spawn, in its own design so nobody mistakes it for
-# a waygate. With Latchkey's lobby set up, Waystation uses that; otherwise the world named here.
+# a waygate. With WelcomeWagon's lobby set up, Waystation uses that; otherwise the world named here.
arrival:
lobby-gate: true
- lobby-world: "" # only used without Latchkey's lobby. "" for no lobby gate
+ lobby-world: "" # only used without WelcomeWagon's lobby. "" for no lobby gate
# lobby-spot: {x: 0, y: 65, z: 0} # where in lobby-world; leave out for its spawn
lobby-label: "Central Station"
# A short rundown when someone walks into the station for the first time, or after this many days away.
diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml
index 1fd771a..989f803 100644
--- a/src/main/resources/paper-plugin.yml
+++ b/src/main/resources/paper-plugin.yml
@@ -18,7 +18,7 @@ dependencies:
Vault: {load: BEFORE, required: false, join-classpath: false}
ViaVersion: {load: BEFORE, required: false, join-classpath: false}
# Optional: its lobby places the lobby gate. Read by name, so Waystation builds and runs without it.
- Latchkey: {load: BEFORE, required: false, join-classpath: false}
+ WelcomeWagon: {load: BEFORE, required: false, join-classpath: false}
permissions:
# default: false everywhere an admin is concerned: operators get nothing for free.
waystation.admin:
diff --git a/test/acceptance.mjs b/test/acceptance.mjs
index 87628a9..258f76f 100644
--- a/test/acceptance.mjs
+++ b/test/acceptance.mjs
@@ -777,7 +777,7 @@ else {
await sleep(2500)
const postOf = b => Object.values(b.entities).find(e => e.name === 'interaction' && Math.hypot(e.position.x - b.entity.position.x, e.position.z - b.entity.position.z) < 8)
const hasPosts = !!postOf(obA) && !!postOf(obB)
- // Servers that use Voidwell's bell turn the island posts off; the post checks don't apply there.
+ // Servers that use OneVoid's bell turn the island posts off; the post checks don't apply there.
if (!hasPosts && process.env.WS_NO_POSTS) console.log(' skip: island posts are off on this server (WS_NO_POSTS)')
else check('each island gets a post', hasPosts)
if (hasPosts) {
diff --git a/test/arrival.mjs b/test/arrival.mjs
index 54f7757..fc52b54 100644
--- a/test/arrival.mjs
+++ b/test/arrival.mjs
@@ -1,19 +1,19 @@
// The arrival flow: the lobby gate into the station, and the welcome inside it. Two small made-up servers on
-// 127.0.0.1:25653, one after the other: fresh Paper with Multiverse-Core and LuckPerms, first without Latchkey (the lobby
-// comes from Waystation's own config) and then with Latchkey 0.3.0 (the lobby comes from Latchkey, read by name).
+// 127.0.0.1:25653, one after the other: fresh Paper with Multiverse-Core and LuckPerms, first without WelcomeWagon (the lobby
+// comes from Waystation's own config) and then with WelcomeWagon 0.3.0 (the lobby comes from WelcomeWagon, read by name).
// No copy of a real server.
//
-// WAYSTATION_ARRIVAL_VERSION is 26.1.2 (default), 26.2 or 26.3. LATCHKEY_JAR is a Latchkey 0.3.0 jar.
+// WAYSTATION_ARRIVAL_VERSION is 26.1.2 (default), 26.2 or 26.3. WELCOMEWAGON_JAR is a WelcomeWagon 0.3.0 jar.
// ./gradlew clean shadowJar, then:
-// WAYSTATION_TEST_JARS= WAYSTATION_TEST_EULA=accept WAYSTATION_TEST_JAVA= LATCHKEY_JAR= node test/arrival.mjs
+// WAYSTATION_TEST_JARS= WAYSTATION_TEST_EULA=accept WAYSTATION_TEST_JAVA= WELCOMEWAGON_JAR= node test/arrival.mjs
import { JAR, freshServer, writeConfig, pluginJar, Server, bot, sleep, check, summary, BASE } from './return-harness.mjs'
import { existsSync, readFileSync, rmSync, writeFileSync, mkdirSync } from 'node:fs'
import path from 'node:path'
const V = process.env.WAYSTATION_ARRIVAL_VERSION ?? '26.1.2'
if (!['26.1.2', '26.2', '26.3'].includes(V)) throw new Error('WAYSTATION_ARRIVAL_VERSION must be 26.1.2, 26.2 or 26.3')
-const LATCHKEY = process.env.LATCHKEY_JAR
-if (!LATCHKEY || !existsSync(LATCHKEY)) throw new Error('Set LATCHKEY_JAR to a Latchkey 0.3.0 jar')
+const WELCOMEWAGON = process.env.WELCOMEWAGON_JAR
+if (!WELCOMEWAGON || !existsSync(WELCOMEWAGON)) throw new Error('Set WELCOMEWAGON_JAR to a WelcomeWagon 0.3.0 jar')
const PORT = 25653, LABEL = 'Central Station'
/** One gate from gates.yml, read as plain text, so the test doesn't trust the plugin's own reader. */
@@ -39,7 +39,7 @@ async function setup(s) {
console.log(`Arrival suite on Paper ${V}, port ${PORT}; servers in ${BASE}`)
-// --- without Latchkey: the lobby is Waystation's own setting ---
+// --- without WelcomeWagon: the lobby is Waystation's own setting ---
{
const folder = freshServer('arrival', { version: V, port: PORT, plugins: [JAR, pluginJar('multiverse-core')] })
writeConfig(folder, [['lobby-world: ""', 'lobby-world: world'], ['# lobby-spot: {x: 0, y: 65, z: 0}', 'lobby-spot: {x: 60.5, y: -60, z: 60.5}']])
@@ -48,7 +48,7 @@ console.log(`Arrival suite on Paper ${V}, port ${PORT}; servers in ${BASE}`)
await s.start()
await setup(s)
const g = await until(() => { const x = gate(folder, 'return-world'); return x && x.label === LABEL ? x : null })
- check('without Latchkey, the configured lobby world gets a lobby gate with the lobby label', !!g, JSON.stringify(g))
+ check('without WelcomeWagon, the configured lobby world gets a lobby gate with the lobby label', !!g, JSON.stringify(g))
check('it stands by the lobby spot, not the world spawn', g && dist(g, 60.5, 60.5) <= 24 && dist(g, 0.5, 0.5) > 24, g && `${g.x},${g.z}`)
check('it leads to the station', g?.destination === 'waystation')
@@ -162,17 +162,17 @@ console.log(`Arrival suite on Paper ${V}, port ${PORT}; servers in ${BASE}`)
const human = (await s.ask('gate list', 1500)).join('\n')
check('without --json, gate list reads as before', /Station seed -?\d+, plan/.test(human) && /return-world: world /.test(human) && !/ea-result/.test(human), human.slice(0, 200))
check('no Waystation errors', s.errors().length === 0, s.errors().slice(0, 2).join(' | '))
- } catch (e) { check('the run without Latchkey finished', false, e.message) } finally { await s.stop(); rmSync(folder, { recursive: true, force: true }) }
+ } catch (e) { check('the run without WelcomeWagon finished', false, e.message) } finally { await s.stop(); rmSync(folder, { recursive: true, force: true }) }
}
-// --- with Latchkey: its lobby wins, and its arrival event moves the gate when the lobby moves ---
+// --- with WelcomeWagon: its lobby wins, and its arrival event moves the gate when the lobby moves ---
{
- const folder = freshServer('arrival-lk', { version: V, port: PORT, plugins: [JAR, pluginJar('multiverse-core'), LATCHKEY] })
- writeConfig(folder, [['lobby-world: ""', 'lobby-world: world']]) // Latchkey's lobby must win over this
- mkdirSync(path.join(folder, 'plugins/Latchkey'), { recursive: true })
- const lk = path.join(folder, 'plugins/Latchkey/config.yml')
+ const folder = freshServer('arrival-lk', { version: V, port: PORT, plugins: [JAR, pluginJar('multiverse-core'), WELCOMEWAGON] })
+ writeConfig(folder, [['lobby-world: ""', 'lobby-world: world']]) // WelcomeWagon's lobby must win over this
+ mkdirSync(path.join(folder, 'plugins/WelcomeWagon'), { recursive: true })
+ const lk = path.join(folder, 'plugins/WelcomeWagon/config.yml')
const lkConfig = spot => {
- const shipped = readFileSync(path.join(path.dirname(LATCHKEY), '../../src/main/resources/config.yml'), 'utf8')
+ const shipped = readFileSync(path.join(path.dirname(WELCOMEWAGON), '../../src/main/resources/config.yml'), 'utf8')
writeFileSync(lk, shipped.slice(0, shipped.indexOf('\nlobby:')) + `\nlobby:\n world: hub\n spawn: {x: ${spot[0]}, y: -60, z: ${spot[1]}}\n send: always\n`)
}
lkConfig([30.5, 30.5])
@@ -180,27 +180,27 @@ console.log(`Arrival suite on Paper ${V}, port ${PORT}; servers in ${BASE}`)
try {
await s.start()
await setup(s)
- check('Waystation found Latchkey\'s lobby by name', s.log.some(l => /Using Latchkey's lobby for the lobby gate/.test(l)))
+ check('Waystation found WelcomeWagon\'s lobby by name', s.log.some(l => /Using WelcomeWagon's lobby for the lobby gate/.test(l)))
await s.ask('mv create hub normal --world-type flat --no-structures', 10000)
await s.ask('lp group default permission set multiverse.access.hub true', 400)
- await s.ask('latchkey reload', 1500)
- // A join fires Latchkey's PlayerArrivedEvent, which Waystation reads by name and acts on.
+ await s.ask('welcomewagon reload', 1500)
+ // A join fires WelcomeWagon's PlayerArrivedEvent, which Waystation reads by name and acts on.
const b = await bot('Visitor', { port: PORT, physics: V !== '26.3' })
const g = await until(() => { const x = gate(folder, 'return-hub'); return x && x.label === LABEL ? x : null }, 60000)
- check('with Latchkey, its lobby world gets the lobby gate', !!g, JSON.stringify(gate(folder, 'return-hub')))
- check('by Latchkey\'s lobby spot', g && dist(g, 30.5, 30.5) <= 24, g && `${g.x},${g.z}`)
+ check('with WelcomeWagon, its lobby world gets the lobby gate', !!g, JSON.stringify(gate(folder, 'return-hub')))
+ check('by WelcomeWagon\'s lobby spot', g && dist(g, 30.5, 30.5) <= 24, g && `${g.x},${g.z}`)
const w = gate(folder, 'return-world')
check('and Waystation\'s own lobby-world setting gives way to it', !w || w.label !== LABEL, JSON.stringify(w))
b.quit(); await sleep(1500)
lkConfig([-120.5, 90.5])
- await s.ask('latchkey reload', 1500)
+ await s.ask('welcomewagon reload', 1500)
const b2 = await bot('Visitor', { port: PORT, physics: V !== '26.3' })
const moved = await until(() => { const x = gate(folder, 'return-hub'); return x && dist(x, -120.5, 90.5) <= 24 ? x : null }, 60000)
- check('when Latchkey\'s lobby moves, the next arrival puts the gate by the new spot', !!moved, JSON.stringify(gate(folder, 'return-hub')))
+ check('when WelcomeWagon\'s lobby moves, the next arrival puts the gate by the new spot', !!moved, JSON.stringify(gate(folder, 'return-hub')))
b2.quit(); await sleep(1000)
check('no Waystation errors', s.errors().length === 0, s.errors().slice(0, 2).join(' | '))
- } catch (e) { check('the run with Latchkey finished', false, e.message) } finally { await s.stop(); rmSync(folder, { recursive: true, force: true }) }
+ } catch (e) { check('the run with WelcomeWagon finished', false, e.message) } finally { await s.stop(); rmSync(folder, { recursive: true, force: true }) }
}
summary()
diff --git a/test/return-harness.mjs b/test/return-harness.mjs
index c6117b5..da755b7 100644
--- a/test/return-harness.mjs
+++ b/test/return-harness.mjs
@@ -1,7 +1,7 @@
// Harness for the return suite: fresh, empty Paper servers in a temp folder on 127.0.0.1, driven from their consoles,
// with mineflayer bots as players. Unlike harness.mjs it needs no copy of a real server, since the return command
// is for a one-world server without Multiverse. It never touches any folder it didn't create.
-// Adapted from ReturnGate's harness, which this suite replaces.
+// Adapted from Wayport's harness, which this suite replaces.
import { spawn, execSync } from 'node:child_process'
import { existsSync, readFileSync, readdirSync, writeFileSync, copyFileSync, mkdirSync, rmSync, mkdtempSync } from 'node:fs'
import os from 'node:os'
diff --git a/test/return.mjs b/test/return.mjs
index aaa8830..d2b04eb 100644
--- a/test/return.mjs
+++ b/test/return.mjs
@@ -8,7 +8,7 @@
//
// The bots are 26.1 clients: on 26.2 and 26.3 they come in through ViaVersion and ViaBackwards. A bot can't follow a
// transfer by itself, so it records the transfer packet and reconnects the way a client does after one (intent 3).
-// Ported from ReturnGate's acceptance suite, which this replaces.
+// Ported from Wayport's acceptance suite, which this replaces.
//
// WAYSTATION_TEST_JARS= WAYSTATION_TEST_EULA=accept WAYSTATION_TEST_JAVA= node test/return.mjs
import { JAR, freshServer, writeConfig, setProperty, Server, FakeStatus, bot, settle, sleep, said, saidCount, check, summary, BASE, CLIENT } from './return-harness.mjs'
@@ -33,7 +33,7 @@ const pistonPush = b => {
}
const LABEL = 'Test Destination'
/** Waystation's config with a destination and the return command turned on. */
-const config = ({ host = '127.0.0.1', port = TRANSFER_PORT, command = 'returngate', aliases = [], destination = 'home', enabled = true, protocols = [PROTOCOL] } = {}) => [
+const config = ({ host = '127.0.0.1', port = TRANSFER_PORT, command = 'wayport', aliases = [], destination = 'home', enabled = true, protocols = [PROTOCOL] } = {}) => [
['return:\n enabled: false\n destination: "" # a name from fargate-destinations\n command: return ',
`return:\n enabled: ${enabled}\n destination: "${destination}"\n command: ${command} `],
[' aliases: []\n permission: waystation.return', ` aliases: [${aliases.join(', ')}]\n permission: waystation.return`],
@@ -61,7 +61,7 @@ async function player(name, { allowed = true, admin = false, port = SRC_PORT, se
b.chat_log.length = 0
return b
}
-async function start(b, cmd = '/returngate') {
+async function start(b, cmd = '/wayport') {
b.chat(cmd)
const end = Date.now() + 3000
while (Date.now() < end && !said(b, STARTED)) await sleep(50)
@@ -91,9 +91,9 @@ check('and makes no station world', !(await src.ask('gate list', 800)).some(l =>
{
const b = await player('noperm', { allowed: false })
await sleep(1000)
- check("a player without waystation.return doesn't see the command", !b.commands.has('returngate'), [...b.commands].filter(c => /gate|return|station/.test(c)).join(', '))
+ check("a player without waystation.return doesn't see the command", !b.commands.has('wayport'), [...b.commands].filter(c => /gate|return|station/.test(c)).join(', '))
check('there is no /station without a station to go to', !b.commands.has('station') && !b.commands.has('hub'))
- b.chat('/returngate')
+ b.chat('/wayport')
await sleep(AFTER)
check('a player without the permission is refused', !said(b, STARTED) && b.transfers.length === 0, b.chat_log.join(' | '))
b.quit()
@@ -104,7 +104,7 @@ check('and makes no station world', !(await src.ask('gate list', 800)).some(l =>
await src.ask('op opret', 600)
const b = await player('opret', { allowed: false })
await sleep(1000)
- b.chat('/returngate')
+ b.chat('/wayport')
await sleep(AFTER)
check('an operator without an explicit grant is refused too', !said(b, STARTED) && b.transfers.length === 0, b.chat_log.join(' | '))
b.quit()
@@ -114,7 +114,7 @@ check('and makes no station world', !(await src.ask('gate list', 800)).some(l =>
// Success, with head turns along the way
{
const b = await player('turner')
- check('a permitted player sees the command', b.commands.has('returngate'))
+ check('a permitted player sees the command', b.commands.has('wayport'))
const ok = await start(b)
const turning = PHYS ? setInterval(() => b.look(Math.random() * Math.PI * 2, (Math.random() - 0.5) * 1.5, true), 150) : null
await waitFor(() => b.transfers.length > 0, AFTER)
@@ -139,7 +139,7 @@ check('and makes no station world', !(await src.ask('gate list', 800)).some(l =>
if (PHYS) { b.setControlState('forward', true); await sleep(600); b.setControlState('forward', false) } else pistonPush(b)
await sleep(AFTER)
check(PHYS ? 'walking cancels it' : 'being moved a block by a piston cancels it', said(b, /Cancelled: you moved/) && b.transfers.length === 0, b.chat_log.join(' | '))
- check('the cancel message says how to try again, with the configured command', said(b, /Stand still and run \/returngate again/))
+ check('the cancel message says how to try again, with the configured command', said(b, /Stand still and run \/wayport again/))
b.quit()
}
if (PHYS) {
@@ -155,7 +155,7 @@ if (PHYS) {
// Repeating the command
{
const b = await player('repeater')
- b.chat('/returngate'); await sleep(300); b.chat('/returngate'); await sleep(1500); b.chat('/returngate')
+ b.chat('/wayport'); await sleep(300); b.chat('/wayport'); await sleep(1500); b.chat('/wayport')
await sleep(AFTER)
check('running it again gives one countdown and one transfer',
saidCount(b, STARTED) === 1 && saidCount(b, /already on your way/) === 2 && b.transfers.length === 1, `${saidCount(b, STARTED)} started, ${b.transfers.length} transfers`)
@@ -253,14 +253,14 @@ async function damageCase(name, label, act, re = /Cancelled: you took damage/) {
await sleep(800)
src.send('ride rider mount @e[type=minecraft:minecart,limit=1,sort=nearest]')
await sleep(1000)
- b.chat('/returngate'); await sleep(AFTER)
+ b.chat('/wayport'); await sleep(AFTER)
check('riding something: told to hop off, nothing starts', said(b, /Hop off your ride/) && !said(b, STARTED) && b.transfers.length === 0, b.chat_log.join(' | '))
src.send('kill @e[type=minecraft:minecart]'); b.quit()
}
// Console
{
- const out = await src.ask('returngate')
+ const out = await src.ask('wayport')
check("the console is told it's for players only", out.some(l => /Only players can use this/.test(l)), out.join(' | '))
}
@@ -322,7 +322,7 @@ await restartSource(config({ host: 'no-such-host.invalid' }))
await restartSource(config({ protocols: [1] }))
{
const b = await player('oldgame')
- b.chat('/returngate'); await sleep(2500)
+ b.chat('/wayport'); await sleep(2500)
check("a client version the destination doesn't take: told so, nothing starts", said(b, /Your game version can't join Test Destination/) && !said(b, STARTED) && b.transfers.length === 0, b.chat_log.join(' | '))
b.quit()
}
@@ -330,11 +330,11 @@ await restartSource(config({ destination: 'nowhere' }))
{
check('a destination that isn\'t defined is logged at startup', src.log.some(l => /\[Waystation\] The return command isn't ready: return\.destination "nowhere" isn't under fargate-destinations/.test(l)))
const admin = await player('admin', { admin: true })
- admin.chat('/returngate'); await sleep(2000)
+ admin.chat('/wayport'); await sleep(2000)
check('an admin is told exactly what to fix', said(admin, /The return command isn't set up: return\.destination "nowhere" isn't under fargate-destinations\. Fix it in plugins\/Waystation\/config\.yml/) && !said(admin, STARTED), admin.chat_log.join(' | '))
admin.quit()
const plain = await player('plain')
- plain.chat('/returngate'); await sleep(2000)
+ plain.chat('/wayport'); await sleep(2000)
check('a player is told it isn\'t set up, without the details', said(plain, /This command isn't set up yet\. Let an admin know/) && !said(plain, /fargate-destinations/), plain.chat_log.join(' | '))
plain.quit()
}
@@ -344,7 +344,7 @@ await restartSource(config({ command: 'hop', aliases: ['hopback'] }))
{
const b = await player('renamed')
await sleep(1000)
- check('the command name and aliases come from config', b.commands.has('hop') && b.commands.has('hopback') && !b.commands.has('returngate'), [...b.commands].filter(c => /hop|return/.test(c)).join(', '))
+ check('the command name and aliases come from config', b.commands.has('hop') && b.commands.has('hopback') && !b.commands.has('wayport'), [...b.commands].filter(c => /hop|return/.test(c)).join(', '))
const ok = await start(b, '/hopback')
await waitFor(() => b.transfers.length > 0, AFTER)
check('an alias works', ok && transferredTo(b, TRANSFER_PORT))