Examples
Event Handler
Respond to chat messages:
import bot
@on("chat_message")
def handle_chat(sender, message, msg_type):
if message == "!hello":
bot.chat(f"Hello {sender}!")
Query Bot State
Get bot information:
import bot
pos = bot.position()
health = bot.health()
hunger = bot.hunger()
dim = bot.dimension()
print(f"Position: {pos['x']}, {pos['y']}, {pos['z']}")
print(f"Health: {health}, Hunger: {hunger}")
print(f"Dimension: {dim}")
Control Baritone
Navigate and mine:
import baritone
# Go to coordinates
baritone.goto(100, 64, 200)
# Follow player
baritone.follow("PlayerName")
# Mine blocks
baritone.mine("diamond_ore")
# Cancel task
baritone.cancel()
Control Meteor
Enable modules and configure settings:
import meteor
# Enable module
meteor.enable("auto-totem")
# Configure setting
meteor.set_setting("auto-totem", "health", 10.0)
# Toggle module
meteor.toggle("kill-aura")
# Disable module
meteor.disable("auto-totem")
Logging
Log messages to console:
import utils
utils.log("Script started")
utils.error("Something went wrong")
Combined Example
Full script using multiple features:
import bot
import baritone
import meteor
import utils
# Enable modules on connect
@on("player_state")
def on_connect(state):
meteor.enable("auto-totem")
utils.log("auto-totem enabled")
# Handle chat commands
@on("chat_message")
def handle_commands(sender, message, msg_type):
if message == "!follow":
baritone.follow(sender)
bot.chat(f"Following {sender}")
elif message == "!stop":
baritone.cancel()
bot.chat("Stopped")
elif message == "!status":
pos = bot.position()
health = bot.health()
bot.chat(f"HP: {health} Pos: {pos['x']:.0f}, {pos['y']:.0f}, {pos['z']:.0f}")
# Monitor health
@on("health_change")
def health_monitor(old_health, new_health):
if new_health < 10:
baritone.cancel()
utils.log("Low health!")
Orchestrator and Workers
A global script (Global Scripts tab) that hands out mining tasks and reacts to
worker reports, plus a worker script that lives in each bot's Scripts tab. See
the comms module for the messaging details.
Worker - miner.py in a bot's Scripts tab:
import bot
import baritone
import comms
import utils
comms.subscribe() # open the mailbox for addressed sends
while True:
msg = comms.receive(timeout=5.0)
if msg is None:
continue
cmd = msg["data"]["cmd"]
if cmd == "mine":
block = msg["data"]["block"]
utils.log(f"Mining {block}")
baritone.mine(block)
elif cmd == "stop":
baritone.cancel()
# Report status back to whoever sent the command
picks = sum(1 for i in bot.inventory() if "pickaxe" in i["item_id"])
if picks == 0:
comms.send(msg["sender_scope"], {"status": "no_pickaxes"}, topic="reports")
Orchestrator - global script:
import bot
import comms
import manager
import utils
def command_bot(name, task):
# Start the worker script (and the game client) on demand, then send.
if not bot.is_online(name):
bot.start(name)
if not bot.wait_for_online(timeout=120, bot_name=name):
utils.error(f"{name} failed to come online")
return
if comms.send(name, task) == 0:
manager.run_script("miner.py", name)
import time
time.sleep(1) # let it start and subscribe
comms.send(name, task)
@on("script_message")
def on_report(msg):
if msg["data"].get("status") == "no_pickaxes":
worker = msg["sender_scope"]
utils.log(f"{worker} is out of pickaxes - sending it to restock")
comms.send(worker, {"cmd": "stop"})
@on("bot_disconnected")
def on_bot_lost(bot_name, uptime_seconds):
utils.log(f"{bot_name} disconnected after {uptime_seconds:.0f}s")
command_bot("Miner1", {"cmd": "mine", "block": "diamond_ore"})
command_bot("Miner2", {"cmd": "mine", "block": "iron_ore"})
# The script's body is done, but the @on handlers keep it alive and reacting.