Skip to content

Releases: Backas03/VitaminMCP-minecraft

3.0.0

Choose a tag to compare

@github-actions github-actions released this 23 Aug 20:33

Full Changelog: 2.2.0...3.0.0

2.2.0

Choose a tag to compare

@github-actions github-actions released this 23 Aug 15:39

Full Changelog: 2.1.1...2.2.0

2.1.1

Choose a tag to compare

@github-actions github-actions released this 22 Aug 19:54

Full Changelog: 2.1.0...2.1.1

2.1.0

Choose a tag to compare

@github-actions github-actions released this 22 Aug 19:16

Full Changelog: 2.0.0...2.1.0

2.0.0

Choose a tag to compare

@github-actions github-actions released this 22 Aug 15:59

Full Changelog: 1.5.1...2.0.0

1.5.1

Choose a tag to compare

@github-actions github-actions released this 21 Aug 13:20

Full Changelog: 1.5.0...1.5.1

1.5.0

Choose a tag to compare

@github-actions github-actions released this 21 Aug 12:42

Full Changelog: 1.4.2...1.5.0

1.4.2

Choose a tag to compare

@Backas03 Backas03 released this 07 Aug 05:11

Two MCP sessions can now drive one server. Both failures below showed up the same way — one session worked and the other appeared not to connect — and neither said why.

Fixed

wait_for starved every other client. The agent served requests from four threads, and wait_for sits on its thread for up to a minute while a condition comes true. Four concurrent waits therefore held every thread the agent had, and each further request — from any session — queued until one finished. A second session's call never returned and its MCP client timed out.

Measured against a real agent, four waits in flight:

idle four waits running
before 0.08s 28.01s
after 0.08s 0.00s

Waits now run on a pool of their own, bounded at 32. Past that a caller gets 429 and a message saying so, rather than joining a queue and later reporting a timeout it never spent waiting.

A bot name already on the server evicted whoever held it. A bot's UUID is derived from its name — that is what makes Tester1 the same player every run — so two sessions using one name are one player, and the server admits a player once. It resolves the clash by taking the newcomer and kicking the incumbent.

Which side lost was a race. Often the second bot_spawn was rejected; sometimes it won and the first session's bot vanished with nothing reported, its own bot_spawn having already returned success.

bot_spawn now asks whether that player is online before connecting and refuses if so, leaving the existing bot alone. A rejection that still races through explains itself instead of arriving as the bare translation key multiplayer.disconnect.duplicate_login.

Upgrading

Give each session its own bot names. Lobby_Tester1 and Survival_Tester1 rather than Tester1 twice. Names are identities here, so sharing one across sessions was never going to mean two players — the difference is that it now says so instead of quietly dropping one.

Nothing else changes. session_start was never the problem: two of them against one agent both return in 0.53s, before and after.

1.4.1

Choose a tag to compare

@Backas03 Backas03 released this 06 Aug 12:57

A patch release over 1.4.0. If you are on 1.4.0, take this one — its jars are otherwise identical.

Fixed

initialize reported the wrong version. serverInfo answered 1.0.0-SNAPSHOT, hardcoded, and wrong since 1.0.0. It is what an MCP client displays for this server, so the one place you could read the version was the one place that never got updated — 1.4.0's own jar still calls itself 1.0.0-SNAPSHOT.

The number now comes from the jar manifest, which Gradle fills from the project version, so there is no second copy to forget. Running from a directory rather than a jar — an IDE or a test run — reports dev.

Upgrading

Replace the three jars. Nothing else changes: no tool, parameter or behaviour differs from 1.4.0.

Everything in 1.4.0 — several sessions at once for proxied networks, and the resource-pack hang fix — is in this release too. Read those notes if you are coming from 1.3.0.

1.4.0

Choose a tag to compare

@Backas03 Backas03 released this 06 Aug 12:51

Several servers at once. A BungeeCord network is more than one server, and until now connecting to the second one disconnected the first one's bots.

Added

session_start can be called more than once. Sessions coexist under a name, and starting one never disturbs another:

session_start {"session": "lobby",    "port": 25577, "mcpPort": 25585, "token": "..."}
session_start {"session": "survival", "port": 25577, "mcpPort": 25586, "token": "..."}

port is the proxy's port in every session — that is where a real player connects, and bots are real players. What distinguishes them is mcpPort, the agent inside each backend server. The default name is host:port@mcpPort for exactly that reason: behind a proxy every session shares host:port, so a default without the agent port would collapse the whole network into one entry.

Every other tool takes session. bot_spawn, bot_inspect, bot_run_scenario, and the proxied agent tools:

bot_spawn    {"session": "lobby", "name": "Tester1"}
command_exec {"session": "lobby", "command": "send Tester1 survival"}
state_query  {"session": "survival", "kind": "player", "target": "Tester1"}

Omit it and it resolves only while one session is open. With several it is an error naming them, rather than a guess — the sessions of a network differ by which backend they observe, so picking one for you would send a command to the wrong server and report success.

session_reset gained close. Each session holds a bot runner process, so there has to be a way to release one you are done with:

session_reset {"session": "survival", "close": "true"}

Fixed

A server that pushes a resource pack hung the bot until the login timed out. The push happens during the configuration phase and it is a configuration task: the server's queue does not advance until the client says what became of the pack. MCProtocolLib answers the other blocking packets of that phase for us — keep-alive, known packs, finish-configuration — but not this one. So the bot said nothing, the join packet never arrived, and connect() spent its full 30 seconds before reporting "did not reach the world" for a server that was only waiting for an answer it was owed.

Measured against Paper 1.21.8 with resource-pack set:

before 30.36s, did not reach the world within PT30S
after 1.07s, Tester1 joined the game

The bot declines the pack, because that is the true statement: it has no renderer and downloads nothing. Custom model data — the one pack-dependent thing a test asserts on — arrives in the item either way, so menu icon checks are unaffected.

Changed

Comments are now javadoc summaries only. Body paragraphs, block tags and every line comment are gone: 124 files, −3834 lines. Nothing else changed — the result was checked against a pre-strip snapshot for byte-identical string literals and identical non-comment tokens, so no behaviour moved with them.

Upgrading

Nothing to change. A single-server session_start behaves exactly as before, and tools called without session still resolve while only one is open.

If your server requires a resource pack, note that declining one marked require-resource-pack=true is a kick — the server's decision, arriving as its own disconnect reason. That is the honest outcome rather than the silent hang it replaces, but it does mean bots cannot join such a server. Turn the requirement off on your test server.