diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..1bcba0f
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "editor.detectIndentation": false
+}
\ No newline at end of file
diff --git a/__pycache__/manager.cpython-311.pyc b/__pycache__/manager.cpython-311.pyc
new file mode 100644
index 0000000..531eb8c
Binary files /dev/null and b/__pycache__/manager.cpython-311.pyc differ
diff --git a/__pycache__/mcbot.cpython-311.pyc b/__pycache__/mcbot.cpython-311.pyc
new file mode 100644
index 0000000..f5e9023
Binary files /dev/null and b/__pycache__/mcbot.cpython-311.pyc differ
diff --git a/__pycache__/task_funcs.cpython-311.pyc b/__pycache__/task_funcs.cpython-311.pyc
new file mode 100644
index 0000000..737a609
Binary files /dev/null and b/__pycache__/task_funcs.cpython-311.pyc differ
diff --git a/__pycache__/webui.cpython-311.pyc b/__pycache__/webui.cpython-311.pyc
new file mode 100644
index 0000000..d924150
Binary files /dev/null and b/__pycache__/webui.cpython-311.pyc differ
diff --git a/main.py b/main.py
index 9fcacd4..1d56728 100644
--- a/main.py
+++ b/main.py
@@ -1,89 +1,36 @@
-from javascript import require, On, off
-mineflayer = require('mineflayer')
-pathfinder = require('mineflayer-pathfinder')
+from manager import Manager, Task
+from mcbot import MCBot
+from flask import Flask, render_template
+from time import sleep
+manager = Manager()
-RANGE_GOAL = 3
-SERVER_IP = '127.0.0.1'
-SERVER_PORT = 25565
-BOT_ARGS = {
- 'host': SERVER_IP,
- 'port': SERVER_PORT
- }
+app = Flask("HiveMine")
+
+@app.route('/')
+def root():
+ return render_template("index.html", title="HiveMine")
+
+@app.route('/tasks')
+def tasks():
+ return "
".join([task.name for task in manager.queue.queue])
+
+num = 0
+@app.route('/add_task')
+def add_tasks():
+ global num
+ manager.queue(Task(f"Task {num}", demo_task, num))
+ num += 1
+ return "Done"
-class MCBot:
- def __init__(self, bot_name, bot_args = BOT_ARGS):
- self.bot_args = {
- 'host': bot_args['host'],
- 'port': bot_args['port'],
- 'username': bot_name
- }
- self.reconnect = True
- self.bot_name = bot_name
- self.start_bot()
+def run():
+ for i in range(1):
+ MCBot(f"bot{i}", manager, is_king = (i == 0))
+ app.run()
- def start_bot(self):
- self.bot = mineflayer.createBot(self.bot_args)
- self.bot.loadPlugin(pathfinder.pathfinder)
- print(f"Started mineflayer but with the name {self.bot_name}")
- self.start_listeners()
+def demo_task(num):
+ sleep(1)
+ print(f"Task {num}")
- def start_listeners(self):
- @On(self.bot, 'login')
- def handle_login(this):
- bot_socket = self.bot._client.socket
- print(
- f"Logged in to {bot_socket.server if bot_socket.server else bot_socket._host }"
- )
-
- @On(self.bot, 'spawn')
- def handle_spawn(this):
- print("I spawned 👋")
-
- @On(self.bot, 'chat')
- def handle_chat(this, sender, message, *args):
- print(f"{self.bot_name} got a message: {sender}> {message}")
- if sender and (sender != self.bot_name) and (message.startswith(f"{self.bot_name}: ") or (message.startswith(f"Bots: "))):
- command = " ".join(message.split(' ')[1:])
- if 'come' in command:
- player = self.bot.players[sender]
- print("Target", player)
- target = player.entity
- if not target:
- self.bot.chat("I don't see you !")
- return
-
- pos = target.position
- movements = pathfinder.Movements(self.bot)
- movements.canDig = False
- self.bot.pathfinder.setMovements(movements)
- self.bot.pathfinder.setGoal(pathfinder.goals.GoalNear(pos.x, pos.y, pos.z, RANGE_GOAL))
-
- if 'quit' in command:
- self.reconnect = False
- self.bot.quit()
-
- @On(self.bot, "kicked")
- def handle_kicked(this, reason, loggedIn):
- if loggedIn:
- print(f"Kicked from server: {reason}")
- else:
- print(f"Kicked whilst trying to connect: {reason}")
-
- @On(self.bot, "end")
- def handle_end(this, reason):
- print(f"Disconnected: {reason}")
-
- # Turn off event listeners
- off(self.bot, "login", handle_login)
- off(self.bot, "kicked", handle_kicked)
- off(self.bot, "spawn", handle_spawn)
- off(self.bot, "chat", handle_chat)
- if self.reconnect:
- print("Bot restarting...")
- print(self.bot_name)
- self.start_bot()
- off(self.bot, "end", handle_end)
-
-for i in range(5):
- bot = MCBot(f"bot{i}")
\ No newline at end of file
+if __name__ == '__main__':
+ run()
\ No newline at end of file
diff --git a/manager.py b/manager.py
new file mode 100644
index 0000000..fc5b9cf
--- /dev/null
+++ b/manager.py
@@ -0,0 +1,31 @@
+from queue import Queue
+class Manager:
+ def __init__(self):
+ self.bots = set()
+ self.tasks = Queue()
+ # self.tasks.put(Task("Task A", lambda: print("Task A")))
+ # self.tasks.put(Task("Task B", lambda: print("Task B")))
+ # self.tasks.put(Task("Task C", lambda: print("Task C")))
+ # self.tasks.put(Task("Task D", lambda: print("Task D")))
+ # self.tasks.put(Task("Task E", lambda: print("Task E")))
+
+ def queue(self, task):
+ self.tasks.put(task)
+
+ def get_next_task(self):
+ if len(self.tasks.queue) > 0:
+ return self.tasks.get()
+ else:
+ return None
+
+ def register_bot(self, name):
+ self.bots.add(name)
+
+class Task:
+ def __init__(self, name, func, *args):
+ self.name = name
+ self.func = func
+ self.args = args
+
+ def perform_task(self):
+ self.func(*self.args)
\ No newline at end of file
diff --git a/mcbot.py b/mcbot.py
new file mode 100644
index 0000000..6edefc1
--- /dev/null
+++ b/mcbot.py
@@ -0,0 +1,118 @@
+from javascript import require, On, off, AsyncTask
+from simple_chalk import chalk
+from manager import Task
+from task_funcs import come, collect_wood, print_inventory, craft_item, place_crafting_table
+mineflayer = require('mineflayer')
+pathfinder = require('mineflayer-pathfinder').pathfinder
+mineflayerViewer = require('prismarine-viewer').mineflayer
+blockFinderPlugin = require('mineflayer-blockfinder')(mineflayer)
+
+SERVER_IP = '127.0.0.1'
+SERVER_PORT = 25565
+BOT_ARGS = {
+ 'host': SERVER_IP,
+ 'port': SERVER_PORT
+}
+
+class MCBot:
+ def __init__(self, bot_name, manager, bot_args = BOT_ARGS, is_king = False):
+ self.bot_args = {
+ 'host': bot_args['host'],
+ 'port': bot_args['port'],
+ 'username': bot_name
+ }
+ self.manager = manager
+ self.manager.register_bot(bot_name)
+ self.reconnect = True
+ self.bot_name = bot_name
+ self.start_bot()
+ self.is_king = is_king
+ self.mc_data = None
+ if is_king:
+ mineflayerViewer(self.bot, { 'port': 3007, 'firstPerson': False })
+
+ def log(self, message):
+ print(f"{self.bot_name}: {message}")
+
+ def chat(self, message):
+ print(chalk.cyan(f"{self.bot_name} sent: {message}"))
+ self.bot.chat(message)
+
+ def start_bot(self):
+ self.bot = mineflayer.createBot(self.bot_args)
+ self.bot.loadPlugin(pathfinder)
+ self.bot.loadPlugin(blockFinderPlugin)
+ print(f"Started mineflayer bot with the name {self.bot_name}")
+ self.start_listeners()
+
+ def start_listeners(self):
+ @On(self.bot, 'login')
+ def handle_login(this):
+ bot_socket = self.bot._client.socket
+ self.log(
+ chalk.green(
+ f"Logged in to {bot_socket.server if bot_socket.server else bot_socket._host }"
+ )
+ )
+
+ @On(self.bot, 'spawn')
+ def handle_spawn(this):
+ self.log("I spawned 👋")
+
+ @AsyncTask(start=True)
+ @On(self.bot, 'time')
+ def handle_tick_update(this):
+ task = self.manager.get_next_task()
+ if task:
+ task.perform_task()
+
+ @On(self.bot, 'chat')
+ def handle_chat(this, sender, message, *args):
+ if not self.is_king:
+ return
+ if sender not in self.manager.bots:
+ self.log(f"chat message: {sender}> {message}")
+
+ if sender and (sender != self.bot_name) and (message.startswith(f"~")):
+ args = message.split(' ')
+ if 'come' in message:
+ self.manager.queue(Task(f"Come to {sender}", come, self, sender))
+
+ if 'collect-wood' in message:
+ self.manager.queue(Task(f"Collect {args[1]} wood", collect_wood, self, args[1]))
+
+ if 'list-inv' in message:
+ self.manager.queue(Task(f"Listing inventory", print_inventory, self))
+
+ if 'place-table' in message:
+ self.manager.queue(Task(f"Placing crafting table", place_crafting_table, self))
+
+ if 'craft' in message:
+ self.manager.queue(Task(f"Attempting to craft {args[1]}", craft_item, self, args[1]))
+
+ if 'quit' in message:
+ self.reconnect = False
+ self.bot.quit()
+
+ @On(self.bot, "kicked")
+ def handle_kicked(this, reason, loggedIn):
+ if loggedIn:
+ self.log(chalk.redBright(f"Kicked from server: {reason}"))
+ else:
+ self.log(chalk.redBright(f"Kicked whilst trying to connect: {reason}"))
+
+ @On(self.bot, "end")
+ def handle_end(this, reason):
+ self.log(chalk.red(f"Disconnected: {reason}"))
+
+ # Turn off event listeners
+ off(self.bot, "login", handle_login)
+ off(self.bot, "kicked", handle_kicked)
+ off(self.bot, "spawn", handle_spawn)
+ off(self.bot, "chat", handle_chat)
+ off(self.bot, "time", handle_tick_update)
+ if self.reconnect:
+ self.log(chalk.blue("Attempting to reconnect"))
+ self.start_bot()
+ off(self.bot, "end", handle_end)
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..b0137fd
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,875 @@
+{
+ "name": "hivemine",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "mineflayer-blockfinder": "^0.0.7"
+ }
+ },
+ "node_modules/@azure/msal-common": {
+ "version": "14.16.0",
+ "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.0.tgz",
+ "integrity": "sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@azure/msal-node": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.2.tgz",
+ "integrity": "sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==",
+ "dependencies": {
+ "@azure/msal-common": "14.16.0",
+ "jsonwebtoken": "^9.0.0",
+ "uuid": "^8.3.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "22.10.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz",
+ "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==",
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "node_modules/@types/readable-stream": {
+ "version": "4.0.18",
+ "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.18.tgz",
+ "integrity": "sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA==",
+ "dependencies": {
+ "@types/node": "*",
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/@xboxreplay/errors": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@xboxreplay/errors/-/errors-0.1.0.tgz",
+ "integrity": "sha512-Tgz1d/OIPDWPeyOvuL5+aai5VCcqObhPnlI3skQuf80GVF3k1I0lPCnGC+8Cm5PV9aLBT5m8qPcJoIUQ2U4y9g=="
+ },
+ "node_modules/@xboxreplay/xboxlive-auth": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@xboxreplay/xboxlive-auth/-/xboxlive-auth-3.3.3.tgz",
+ "integrity": "sha512-j0AU8pW10LM8O68CTZ5QHnvOjSsnPICy0oQcP7zyM7eWkDQ/InkiQiirQKsPn1XRYDl4ccNu0WM582s3UKwcBg==",
+ "dependencies": {
+ "@xboxreplay/errors": "^0.1.0",
+ "axios": "^0.21.1"
+ }
+ },
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/aes-js": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz",
+ "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ=="
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w=="
+ },
+ "node_modules/axios": {
+ "version": "0.21.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+ "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+ "dependencies": {
+ "follow-redirects": "^1.14.0"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/buffer-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz",
+ "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==",
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/discontinuous-range": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
+ "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ=="
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/endian-toggle": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/endian-toggle/-/endian-toggle-0.0.0.tgz",
+ "integrity": "sha512-ShfqhXeHRE4TmggSlHXG8CMGIcsOsqDw/GcoPcosToE59Rm9e4aXaMhEQf2kPBsBRrKem1bbOAv5gOKnkliMFQ=="
+ },
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/jose": {
+ "version": "4.15.9",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz",
+ "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
+ "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ },
+ "node_modules/lodash.reduce": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
+ "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw=="
+ },
+ "node_modules/macaddress": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.5.3.tgz",
+ "integrity": "sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg=="
+ },
+ "node_modules/minecraft-data": {
+ "version": "3.78.0",
+ "resolved": "https://registry.npmjs.org/minecraft-data/-/minecraft-data-3.78.0.tgz",
+ "integrity": "sha512-Ssks8QD31lsoxqa7LySTqeP9romsfAbfsSGiUHiGMeqfxRi/PtOxGLyKD1BXB8V/tXLztFcbQYqzIhprDkPguw=="
+ },
+ "node_modules/minecraft-folder-path": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minecraft-folder-path/-/minecraft-folder-path-1.2.0.tgz",
+ "integrity": "sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw=="
+ },
+ "node_modules/minecraft-protocol": {
+ "version": "1.50.0",
+ "resolved": "https://registry.npmjs.org/minecraft-protocol/-/minecraft-protocol-1.50.0.tgz",
+ "integrity": "sha512-GiZy8g4YG0iZEKifX6ulCyhVnTDGZ1gH0ouUdxjo6xkKwp4KOf+ptbBgZ8G5+WHCumrI91+v/JYU07uCvKdi0w==",
+ "dependencies": {
+ "@types/readable-stream": "^4.0.0",
+ "aes-js": "^3.1.2",
+ "buffer-equal": "^1.0.0",
+ "debug": "^4.3.2",
+ "endian-toggle": "^0.0.0",
+ "lodash.get": "^4.1.2",
+ "lodash.merge": "^4.3.0",
+ "minecraft-data": "^3.78.0",
+ "minecraft-folder-path": "^1.2.0",
+ "node-fetch": "^2.6.1",
+ "node-rsa": "^0.4.2",
+ "prismarine-auth": "^2.2.0",
+ "prismarine-chat": "^1.10.0",
+ "prismarine-nbt": "^2.5.0",
+ "prismarine-realms": "^1.2.0",
+ "protodef": "^1.17.0",
+ "readable-stream": "^4.1.0",
+ "uuid-1345": "^1.0.1",
+ "yggdrasil": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/mineflayer": {
+ "version": "2.41.0",
+ "resolved": "https://registry.npmjs.org/mineflayer/-/mineflayer-2.41.0.tgz",
+ "integrity": "sha512-IFFy4NgF24FU2PkAwazJphl2F+3gpbpN578ex0sq1XfcBBRge3kCz1UC2KDMjKI+V/8vffOL+OEnug9jt3f7Vw==",
+ "dependencies": {
+ "minecraft-data": "^2.70.0",
+ "minecraft-protocol": "^1.17.0",
+ "prismarine-biome": "^1.1.0",
+ "prismarine-block": "^1.6.0",
+ "prismarine-chat": "^1.0.0",
+ "prismarine-chunk": "^1.20.3",
+ "prismarine-entity": "^1.0.0",
+ "prismarine-item": "^1.5.0",
+ "prismarine-physics": "^1.0.4",
+ "prismarine-recipe": "^1.1.0",
+ "prismarine-windows": "^1.5.0",
+ "prismarine-world": "^3.2.0",
+ "protodef": "^1.8.0",
+ "typed-emitter": "^1.2.0",
+ "vec3": "^0.1.6"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/mineflayer-blockfinder": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mineflayer-blockfinder/-/mineflayer-blockfinder-0.0.7.tgz",
+ "integrity": "sha512-1+r7AwMw90E2qforbhpJ1T/G2sBfb7Lu7efepZ9BZ1xu0npL/FW71ZLPbwq8w8IwW9H0ogOLBn7lIWbQIf/KEw==",
+ "dependencies": {
+ "mineflayer": "^2.1.0",
+ "vec3": "^0.1.3"
+ }
+ },
+ "node_modules/mineflayer/node_modules/minecraft-data": {
+ "version": "2.221.0",
+ "resolved": "https://registry.npmjs.org/minecraft-data/-/minecraft-data-2.221.0.tgz",
+ "integrity": "sha512-0AhqzbIKb6WqPSF6qBevaPryeWOz545hLxt6q+gfJF8YIQX/YfkyX/nXWhl+pSIS2rTBcQ0RJkRCtTeRzQwHDA=="
+ },
+ "node_modules/mojangson": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/mojangson/-/mojangson-2.0.4.tgz",
+ "integrity": "sha512-HYmhgDjr1gzF7trGgvcC/huIg2L8FsVbi/KacRe6r1AswbboGVZDS47SOZlomPuMWvZLas8m9vuHHucdZMwTmQ==",
+ "dependencies": {
+ "nearley": "^2.19.5"
+ }
+ },
+ "node_modules/moo": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz",
+ "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q=="
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/nearley": {
+ "version": "2.20.1",
+ "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz",
+ "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==",
+ "dependencies": {
+ "commander": "^2.19.0",
+ "moo": "^0.5.0",
+ "railroad-diagrams": "^1.0.0",
+ "randexp": "0.4.6"
+ },
+ "bin": {
+ "nearley-railroad": "bin/nearley-railroad.js",
+ "nearley-test": "bin/nearley-test.js",
+ "nearley-unparse": "bin/nearley-unparse.js",
+ "nearleyc": "bin/nearleyc.js"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://nearley.js.org/#give-to-nearley"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-rsa": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.4.2.tgz",
+ "integrity": "sha512-Bvso6Zi9LY4otIZefYrscsUpo2mUpiAVIEmSZV2q41sP8tHZoert3Yu6zv4f/RXJqMNZQKCtnhDugIuCma23YA==",
+ "dependencies": {
+ "asn1": "0.2.3"
+ }
+ },
+ "node_modules/prismarine-auth": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/prismarine-auth/-/prismarine-auth-2.5.0.tgz",
+ "integrity": "sha512-CRv/pL6d/T+4cdjWS223PXG+ygHbz40Kef04L59SLMT+axNdAQro23eZZhgiIIu6u7rlvJcZYlIY93gFNtKxXA==",
+ "dependencies": {
+ "@azure/msal-node": "^2.0.2",
+ "@xboxreplay/xboxlive-auth": "^3.3.3",
+ "debug": "^4.3.3",
+ "jose": "^4.1.4",
+ "node-fetch": "^2.6.1",
+ "smart-buffer": "^4.1.0",
+ "uuid-1345": "^1.0.2"
+ }
+ },
+ "node_modules/prismarine-biome": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/prismarine-biome/-/prismarine-biome-1.3.0.tgz",
+ "integrity": "sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==",
+ "peerDependencies": {
+ "minecraft-data": "^3.0.0",
+ "prismarine-registry": "^1.1.0"
+ }
+ },
+ "node_modules/prismarine-block": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/prismarine-block/-/prismarine-block-1.19.0.tgz",
+ "integrity": "sha512-2tMDqRBrIxOZc2X3HNsGb1LqqA/oyTmKSucktS52aMyxclNdYMWgUcHER0bwrYwbJ00xdQDB6EHByO3QWp1PhQ==",
+ "dependencies": {
+ "minecraft-data": "^3.38.0",
+ "prismarine-biome": "^1.1.0",
+ "prismarine-chat": "^1.5.0",
+ "prismarine-item": "^1.10.1",
+ "prismarine-nbt": "^2.0.0",
+ "prismarine-registry": "^1.1.0"
+ }
+ },
+ "node_modules/prismarine-chat": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/prismarine-chat/-/prismarine-chat-1.10.1.tgz",
+ "integrity": "sha512-XukYcuueuhDxzEXG7r8BZyt6jOObrPPB4JESCgb+/XenB9nExoSHF8eTQWWj8faKPLqm1dRQaYwFJlNBlJZJUw==",
+ "dependencies": {
+ "mojangson": "^2.0.1",
+ "prismarine-nbt": "^2.0.0",
+ "prismarine-registry": "^1.4.0"
+ }
+ },
+ "node_modules/prismarine-chunk": {
+ "version": "1.36.0",
+ "resolved": "https://registry.npmjs.org/prismarine-chunk/-/prismarine-chunk-1.36.0.tgz",
+ "integrity": "sha512-RqXtCBz7n4iNG44nkwjqvGebbQIWZYjyCp3ORi3nBeLJ6AnmOH+qauaHkqH8hcyUFS6ObQeFx/xYYMwgMSoCKw==",
+ "dependencies": {
+ "prismarine-biome": "^1.2.0",
+ "prismarine-block": "^1.14.1",
+ "prismarine-nbt": "^2.2.1",
+ "prismarine-registry": "^1.1.0",
+ "smart-buffer": "^4.1.0",
+ "uint4": "^0.1.2",
+ "vec3": "^0.1.3",
+ "xxhash-wasm": "^0.4.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/prismarine-entity": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/prismarine-entity/-/prismarine-entity-1.2.0.tgz",
+ "integrity": "sha512-4dQ9LYl6HDJQrwZHjSKU4D5VNyHRnfrjcw7eVLlbRPkuR50utW5mmfPi4ys9U7tHNmGWHC/cwjH9xzT75LUovQ==",
+ "dependencies": {
+ "vec3": "^0.1.4"
+ }
+ },
+ "node_modules/prismarine-item": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/prismarine-item/-/prismarine-item-1.15.0.tgz",
+ "integrity": "sha512-DysyiCzaI8S7PpRLFylAZnQo2CppXiBbaUp+8rhK+EzvzmMdS+D1/oETQm9ysB5Jw9eCer6iWGMgzZXxJE5+/w==",
+ "dependencies": {
+ "prismarine-nbt": "^2.0.0",
+ "prismarine-registry": "^1.4.0"
+ }
+ },
+ "node_modules/prismarine-nbt": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/prismarine-nbt/-/prismarine-nbt-2.6.0.tgz",
+ "integrity": "sha512-z65ijm6hVlYOmhg8IEzdYfUz1u3AOiQtzyTSAwD8NLBCr96ZUPtUH5o/6sGAoDaN+rkDe0DNBCiO7bvXXO1fkQ==",
+ "dependencies": {
+ "protodef": "^1.9.0"
+ }
+ },
+ "node_modules/prismarine-physics": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/prismarine-physics/-/prismarine-physics-1.9.0.tgz",
+ "integrity": "sha512-4qYF6mQ9fOyONaJIF18eZBzsXPq9RD30gxiXoqFjB7sk/rtLIb5ye72YxeYZA3Q9PyBhGH1ANdrHwJ+21WEedQ==",
+ "dependencies": {
+ "minecraft-data": "^3.0.0",
+ "prismarine-nbt": "^2.0.0",
+ "vec3": "^0.1.7"
+ }
+ },
+ "node_modules/prismarine-realms": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/prismarine-realms/-/prismarine-realms-1.3.2.tgz",
+ "integrity": "sha512-5apl9Ru8veTj5q2OozRc4GZOuSIcs3yY4UEtALiLKHstBe8bRw8vNlaz4Zla3jsQ8yP/ul1b1IJINTRbocuA6g==",
+ "dependencies": {
+ "debug": "^4.3.3",
+ "node-fetch": "^2.6.1"
+ }
+ },
+ "node_modules/prismarine-recipe": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/prismarine-recipe/-/prismarine-recipe-1.3.1.tgz",
+ "integrity": "sha512-xfa9E9ACoaDi+YzNQ+nk8kWSIqt5vSZOOCHIT+dTXscf/dng2HaJ/59uwe1D/jvOkAd2OvM6RRJM6fFe0q/LDA==",
+ "peerDependencies": {
+ "prismarine-registry": "^1.4.0"
+ }
+ },
+ "node_modules/prismarine-registry": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/prismarine-registry/-/prismarine-registry-1.10.0.tgz",
+ "integrity": "sha512-6TYQiZHtsJ87HsB2E0yamCFp77ZyyLT16OmW5iXB5V30yCPflhHvR5TR2IqISmmiRc2093BkHfiIhsOZaMatmQ==",
+ "dependencies": {
+ "minecraft-data": "^3.70.0",
+ "prismarine-nbt": "^2.0.0"
+ }
+ },
+ "node_modules/prismarine-windows": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/prismarine-windows/-/prismarine-windows-1.6.0.tgz",
+ "integrity": "sha512-026LG1yR76Xb62kM+W83IWT7Wy2yKplllbXNFBF2m0Lr4k4YpYKnpLb8tRft8MLOLRbYAt/KnxE/YKvRZul7kw==",
+ "dependencies": {
+ "prismarine-item": "^1.4.0"
+ }
+ },
+ "node_modules/prismarine-world": {
+ "version": "3.6.3",
+ "resolved": "https://registry.npmjs.org/prismarine-world/-/prismarine-world-3.6.3.tgz",
+ "integrity": "sha512-zqdqPEYCDHzqi6hglJldEO63bOROXpbZeIdxBmoQq7o04Lf81t016LU6stFHo3E+bmp5+xU74eDFdOvzYNABkA==",
+ "dependencies": {
+ "vec3": "^0.1.7"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/protodef": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/protodef/-/protodef-1.17.0.tgz",
+ "integrity": "sha512-mnpNPV3xwu63u3NwZuXM1RCp979vjHxUGHzVrb6dxbvof5Fx+b8Rs0G0c3xtEuFDreGAMWS7VrlNkDUDBMsFWQ==",
+ "dependencies": {
+ "lodash.get": "^4.4.2",
+ "lodash.reduce": "^4.6.0",
+ "protodef-validator": "^1.3.0",
+ "readable-stream": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/protodef-validator": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/protodef-validator/-/protodef-validator-1.3.1.tgz",
+ "integrity": "sha512-lZ5FWKZYR9xOjpMw1+EfZRfCjzNRQWPq+Dk+jki47Sikl2EeWEPnTfnJERwnU/EwFq6us+0zqHHzSsmLeYX+Lg==",
+ "dependencies": {
+ "ajv": "^6.5.4"
+ },
+ "bin": {
+ "protodef-validator": "cli.js"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/railroad-diagrams": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
+ "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A=="
+ },
+ "node_modules/randexp": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz",
+ "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==",
+ "dependencies": {
+ "discontinuous-range": "1.0.0",
+ "ret": "~0.1.10"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
+ "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==",
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "buffer": "^6.0.3",
+ "events": "^3.3.0",
+ "process": "^0.11.10",
+ "string_decoder": "^1.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
+ "node_modules/typed-emitter": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-1.4.0.tgz",
+ "integrity": "sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg=="
+ },
+ "node_modules/uint4": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/uint4/-/uint4-0.1.2.tgz",
+ "integrity": "sha512-lhEx78gdTwFWG+mt6cWAZD/R6qrIj0TTBeH5xwyuDJyswLNlGe+KVlUPQ6+mx5Ld332pS0AMUTo9hIly7YsWxQ=="
+ },
+ "node_modules/undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/uuid-1345": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uuid-1345/-/uuid-1345-1.0.2.tgz",
+ "integrity": "sha512-bA5zYZui+3nwAc0s3VdGQGBfbVsJLVX7Np7ch2aqcEWFi5lsAEcmO3+lx3djM1npgpZI8KY2FITZ2uYTnYUYyw==",
+ "dependencies": {
+ "macaddress": "^0.5.1"
+ }
+ },
+ "node_modules/vec3": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/vec3/-/vec3-0.1.10.tgz",
+ "integrity": "sha512-Sr1U3mYtMqCOonGd3LAN9iqy0qF6C+Gjil92awyK/i2OwiUo9bm7PnLgFpafymun50mOjnDcg4ToTgRssrlTcw=="
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/xxhash-wasm": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz",
+ "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA=="
+ },
+ "node_modules/yggdrasil": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/yggdrasil/-/yggdrasil-1.7.0.tgz",
+ "integrity": "sha512-QBIo5fiNd7688G3FqXXYGr36uyrYzczlNuzpWFy2zL3+R+3KT2lF+wFxm51synfA3l3z6IBiGOc1/EVXWCYY1Q==",
+ "dependencies": {
+ "node-fetch": "^2.6.1",
+ "uuid": "^8.2.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..9aef423
--- /dev/null
+++ b/package.json
@@ -0,0 +1,5 @@
+{
+ "dependencies": {
+ "mineflayer-blockfinder": "^0.0.7"
+ }
+}
diff --git a/task_funcs.py b/task_funcs.py
new file mode 100644
index 0000000..fb929b9
--- /dev/null
+++ b/task_funcs.py
@@ -0,0 +1,124 @@
+from javascript import require
+from simple_chalk import chalk
+from time import sleep
+import threading
+pathfinder = require('mineflayer-pathfinder')
+
+def dig_with_wait(bot, block):
+ finished = threading.Event()
+ def on_dig_complete(err):
+ if err:
+ bot.chat("Failed to dig block!")
+ else:
+ bot.chat("Successfully dug block!")
+ finished.set() # Unblock the thread
+
+ bot.dig(block, on_dig_complete)
+ finished.wait() # Block until the dig operation completes
+
+
+def collect_wood(bot_obj, quantity):
+ bot = bot_obj.bot
+ def process_found_wood(err, blockPoints):
+ if err:
+ bot.chat("Error finding oak logs!")
+ return
+ for block in blockPoints:
+ bot.chat(f"Found oak log at {block.position}")
+ pos = block.position
+ bot.pathfinder.goto(pathfinder.goals.GoalNear(pos.x, pos.y, pos.z), lambda: dig_with_wait(bot, block))
+ sleep(5)
+
+
+ bot_obj.log(chalk.magenta(f"Collecting {quantity} oak wood..."))
+ bot.findBlock({
+ "point": bot.entity.position,
+ "matching": bot.registry.blocksByName["oak_log"].id
+ }, process_found_wood)
+
+def print_inventory(bot_obj):
+ bot = bot_obj.bot
+ inv = list(bot.inventory.items())
+ bot.chat("My inventory contains [")
+ for i in range(len(inv)):
+ bot.chat(f"Item {i+1}: {inv[i].displayName} x{inv[i].count}")
+ bot.chat("]")
+
+def place_crafting_table(bot_obj):
+ bot = bot_obj.bot
+ # Check if the bot has a crafting table in its inventory
+ crafting_table_id = bot.registry.itemsByName["crafting_table"].id
+ crafting_table_count = bot.inventory.count(crafting_table_id)
+
+ if crafting_table_count > 0:
+ # Get the bot's current position
+ pos = bot.entity.position
+ # Define the position directly below the bot (y - 1)
+ target_pos = {'x': pos.x, 'y': pos.y - 1, 'z': pos.z}
+
+ # Get the block at the target position
+ target_block = bot.world.getBlock(target_pos)
+
+ # If the block below is empty (not a solid block), place the crafting table
+ if target_block and target_block.name == 'air':
+ # Place the crafting table at the target position
+ bot.placeBlock(target_pos, bot.registry.itemsByName["crafting_table"], None, lambda err: place_callback(err, bot))
+ else:
+ bot.chat("Cannot place crafting table, position is blocked.")
+ else:
+ bot.chat("No crafting table in inventory to place.")
+
+
+def craft_item(bot_obj, item_name, quantity=1):
+ bot = bot_obj.bot
+
+ def on_craft_complete(err):
+ if err:
+ bot.chat(f"Failed to craft {item_name}: {err}")
+ else:
+ bot.chat(f"Successfully crafted {quantity} {item_name}(s).")
+
+ try:
+ try:
+ # Get the item details from the bot's registry
+ item = bot.registry.itemsByName[item_name]
+ item_id = item.id
+ bot.chat(f"Attempting to craft {item.displayName} with ID {item_id}...")
+ except KeyError:
+ bot.chat(f"Unknown item: {item_name}.")
+ return
+
+ recipe = bot.recipesFor(item_id, None, quantity, bot.inventory)
+ if len(list(recipe)) < 1:
+ bot.chat(f"No available recipe for {item_name} with the items I have.")
+ return
+
+ # Check if a crafting table is required
+ if recipe[0].requiresTable and not bot.inventory.count(bot.registry.itemsByName["crafting_table"].id):
+ bot.chat(f"Crafting {item_name} requires a crafting table. I don't have one.")
+ return
+
+ # Start crafting
+ bot.craft(recipe[0], quantity, None, on_craft_complete)
+ bot.chat(f"Successfully crafted {item.displayName}")
+
+ except Exception as e:
+ bot.chat(f"Error during crafting: {str(e)}")
+
+
+
+
+def come(bot_obj, sender):
+ bot = bot_obj.bot
+ sleep(1)
+ player = bot.players[sender]
+ bot_obj.log(chalk.magenta(f"Target {player.username}"))
+ target = player.entity
+ if not target:
+ bot_obj.chat(f"I don't see you {player.username}!")
+ return
+ pos = target.position
+ movements = pathfinder.Movements(bot)
+ movements.canDig = False
+ bot.pathfinder.setMovements(movements)
+ bot.pathfinder.setGoal(pathfinder.goals.GoalNear(pos.x, pos.y, pos.z, 2))
\ No newline at end of file
diff --git a/templates/index.html b/templates/index.html
new file mode 100644
index 0000000..15a84a9
--- /dev/null
+++ b/templates/index.html
@@ -0,0 +1,5 @@
+