diff --git a/index.js b/index.js
index ab1a2c1..632907c 100644
--- a/index.js
+++ b/index.js
@@ -30,9 +30,9 @@ const createBot = function createBot (host, oldId) {
 
   bot._client = createClient({
     host: host.host,
-    port: host.port ? host.port : 25565,
+    port: host.port ?? 25565,
     username: generateUser(host.options.legalName),
-    version: host.version ? host.version : settings.version_mc
+    version: host.version ?? settings.version_mc
   })
 
   bot.info = (msg) => {
diff --git a/launch.cmd b/launch.cmd
index 85a5dce..99c41b8 100644
--- a/launch.cmd
+++ b/launch.cmd
@@ -1,8 +1,15 @@
 @echo off
+
 :botlaunch
-node index.js
-if %errorlevel%==1 (
-	exit
-)
-timeout /nobreak /t 5 > nul
-goto botlaunch
\ No newline at end of file
+	node index.js
+	call :err_unwrap
+
+	timeout /nobreak /t 5 >NUL
+goto botlaunch
+
+:err_unwrap
+    set _err=%ERRORLEVEL%
+    if %_err% neq 0 (
+        exit %_err%
+    )
+goto :eof
diff --git a/launch.sh b/launch.sh
index bd91952..09945a0 100755
--- a/launch.sh
+++ b/launch.sh
@@ -1,6 +1,7 @@
-#!/bin/bash
-while [ true ];
-do node index.js;
-if [ $? -eq 1 ]; then exit; fi
-sleep 6;
+#!/bin/sh
+set -xe
+
+while :; do
+    node index.js
+    sleep 5
 done
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 23d24a8..7f4a155 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,8 @@
       "version": "12.0.0-alpha.2",
       "license": "MIT",
       "dependencies": {
-        "minecraft-protocol": "^1.49.0"
+        "minecraft-protocol": "^1.51.0",
+        "prismarine-chat": "^1.10.1"
       }
     },
     "node_modules/@azure/msal-common": {
@@ -36,12 +37,21 @@
       }
     },
     "node_modules/@types/node": {
-      "version": "22.9.1",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz",
-      "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==",
+      "version": "22.10.2",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz",
+      "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==",
       "license": "MIT",
       "dependencies": {
-        "undici-types": "~6.19.8"
+        "undici-types": "~6.20.0"
+      }
+    },
+    "node_modules/@types/node-rsa": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@types/node-rsa/-/node-rsa-1.1.4.tgz",
+      "integrity": "sha512-dB0ECel6JpMnq5ULvpUTunx3yNm8e/dIkv8Zu9p2c8me70xIRUUG3q+qXRwcSf9rN3oqamv4116iHy90dJGRpA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*"
       }
     },
     "node_modules/@types/readable-stream": {
@@ -188,9 +198,9 @@
       "license": "MIT"
     },
     "node_modules/debug": {
-      "version": "4.3.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
-      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
       "license": "MIT",
       "dependencies": {
         "ms": "^2.1.3"
@@ -420,9 +430,9 @@
       "license": "MIT"
     },
     "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==",
+      "version": "3.80.0",
+      "resolved": "https://registry.npmjs.org/minecraft-data/-/minecraft-data-3.80.0.tgz",
+      "integrity": "sha512-UYq+ADpS9K1+cqiJiz6tqkht4y4cRYF3qOYanG9eIiHY+VC+qIAC7/UcW6G3adayvj5YBOCurlqaw3E0TMAtHg==",
       "license": "MIT"
     },
     "node_modules/minecraft-folder-path": {
@@ -432,11 +442,12 @@
       "license": "MIT"
     },
     "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==",
+      "version": "1.51.0",
+      "resolved": "https://registry.npmjs.org/minecraft-protocol/-/minecraft-protocol-1.51.0.tgz",
+      "integrity": "sha512-ACvquP6fI8TdPXfPNNGTTi9v12WW6LS4k2KmmUBSmNncM0KnUwywqTT6YQIfCff6dUMd9DZB1oaNZfEDto+QQw==",
       "license": "BSD-3-Clause",
       "dependencies": {
+        "@types/node-rsa": "^1.1.4",
         "@types/readable-stream": "^4.0.0",
         "aes-js": "^3.1.2",
         "buffer-equal": "^1.0.0",
@@ -560,12 +571,12 @@
       }
     },
     "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==",
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/prismarine-nbt/-/prismarine-nbt-2.7.0.tgz",
+      "integrity": "sha512-Du9OLQAcCj3y29YtewOJbbV4ARaSUEJiTguw0PPQbPBy83f+eCyDRkyBpnXTi/KPyEpgYCzsjGzElevLpFoYGQ==",
       "license": "MIT",
       "dependencies": {
-        "protodef": "^1.9.0"
+        "protodef": "^1.18.0"
       }
     },
     "node_modules/prismarine-realms": {
@@ -598,9 +609,9 @@
       }
     },
     "node_modules/protodef": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/protodef/-/protodef-1.17.0.tgz",
-      "integrity": "sha512-mnpNPV3xwu63u3NwZuXM1RCp979vjHxUGHzVrb6dxbvof5Fx+b8Rs0G0c3xtEuFDreGAMWS7VrlNkDUDBMsFWQ==",
+      "version": "1.18.0",
+      "resolved": "https://registry.npmjs.org/protodef/-/protodef-1.18.0.tgz",
+      "integrity": "sha512-jO64lkzkh0dYc0AVWCU/GzCKwqhFFIz1kfEz0NBf0RUuRNcmvgKbopabJdfZ6W8NvALdySUXgEhvKDZPhdBwrg==",
       "license": "MIT",
       "dependencies": {
         "lodash.get": "^4.4.2",
@@ -613,9 +624,9 @@
       }
     },
     "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==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/protodef-validator/-/protodef-validator-1.4.0.tgz",
+      "integrity": "sha512-2y2coBolqCEuk5Kc3QwO7ThR+/7TZiOit4FrpAgl+vFMvq8w76nDhh09z08e2NQOdrgPLsN2yzXsvRvtADgUZQ==",
       "license": "MIT",
       "dependencies": {
         "ajv": "^6.5.4"
@@ -741,9 +752,9 @@
       "license": "MIT"
     },
     "node_modules/undici-types": {
-      "version": "6.19.8",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
-      "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+      "version": "6.20.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
       "license": "MIT"
     },
     "node_modules/uri-js": {
diff --git a/package.json b/package.json
index 376782a..034993d 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,7 @@
   "author": "7cc5c4f330d47060",
   "license": "MIT",
   "dependencies": {
-    "minecraft-protocol": "^1.49.0"
+    "minecraft-protocol": "^1.51.0",
+    "prismarine-chat": "^1.10.1"
   }
 }
diff --git a/plugins/console.js b/plugins/console.js
index f2f14c4..7d85990 100755
--- a/plugins/console.js
+++ b/plugins/console.js
@@ -23,32 +23,39 @@ const rl = createInterface({
   prompt: '\x1b[0m> '
 })
 rl.on('line', (l) => {
+  const args = l.split(' ');
+  const cmdName = args[0].toLowerCase();
+
   try {
-    if (cmds[l.split(' ')[0].toLowerCase()]) {
-      if (cmds[l.split(' ')[0].toLowerCase()].consoleIndex) {
-        const tmpcmd = l.split(' ')
-        const index2 = tmpcmd.splice(1, 1)[0]
-        if (index2 === '*') {
-          for (let i = 0; i < bots.length; i++) {
-            const cmd = new Command(uuid, user, nick, tmpcmd.join(' '), 'console', 'console', 'console', '', bots[i])
-            cmd.verify = 2
-            cmds[l.split(' ')[0].toLowerCase()].execute(cmd)
-          }
-        } else {
-          const cmd = new Command(uuid, user, nick, tmpcmd.join(' '), 'console', 'console', 'console', '', bots[+index2])
-          cmd.verify = 2
-          cmds[l.split(' ')[0].toLowerCase()].execute(cmd)
+    const cmd = cmds[cmdName];
+    if (!cmd) {
+      rl.prompt(false);
+      return;
+    }
+
+    if (cmd.consoleIndex) {
+      const index2 = args.splice(1, 1)[0];
+      if (index2 === '*') {
+        for (let i = 0; i < bots.length; i++) {
+          const context = new Command(uuid, user, nick, args.join(' '), 'console', 'console', 'console', '', bots[i])
+          context.verify = 2
+          cmd.execute(context)
         }
       } else {
-        const cmd = new Command(uuid, user, nick, l, 'console', 'console', 'console', '', consoleBotStub)
-        cmd.verify = 2
-        cmds[l.split(' ')[0].toLowerCase()].execute(cmd)
+        const context = new Command(uuid, user, nick, args.join(' '), 'console', 'console', 'console', '', bots[+index2])
+        context.verify = 2
+        cmd.execute(context)
       }
+    } else {
+      const context = new Command(uuid, user, nick, l, 'console', 'console', 'console', '', consoleBotStub)
+      context.verify = 2
+      cmd.execute(context)
     }
   } catch (e) {
     console.log(e)
   }
-  rl.prompt(false)
+
+  rl.prompt(false);
 })
 rl.prompt()
 
@@ -58,6 +65,7 @@ function consoleWrite (text) {
   process.stdout.write(text + '\n')
   rl.prompt(true)
 }
+
 export default function load (b) {
   b.info = (msg) => {
     consoleWrite(`[${b.id}] [info] ${msg}`)
diff --git a/util/Command.js b/util/Command.js
index d728277..8a53726 100644
--- a/util/Command.js
+++ b/util/Command.js
@@ -15,8 +15,8 @@ export default class Command {
     this.colors = settings.colors
     this.lang = settings.defaultLang
     this.verify = 0
-    this.host = bot.host.host
-    this.port = bot.host.port
+    this.host = bot?.host.host
+    this.port = bot?.host.port
     this.bot = bot
 
     this.rewriteCommand = newCmd => {
diff --git a/util/hashcheck.js b/util/hashcheck.js
index 7278b87..32cd644 100755
--- a/util/hashcheck.js
+++ b/util/hashcheck.js
@@ -7,13 +7,12 @@ export default function (cmd, uuid) {
   const dateString = _dateString.slice(0, _dateString.length - 4)
   const hashTrusted = `babyboom:${settings.keyTrusted}:${uuid}:${cmdWithoutHash}:${dateString}`
   const hashOwner = `babyboom:${settings.keyOwner}:${uuid}:${cmdWithoutHash}:${dateString}`
+
+  const hashPart = cmd[cmd.length - 1];
   const validhashT = createHash('sha256').update(hashTrusted).digest('hex')
   const validhashO = createHash('sha256').update(hashOwner).digest('hex')
-  if (cmd[cmd.length - 1] === validhashT) {
-    return 1
-  }
-  if (cmd[cmd.length - 1] === validhashO) {
-    return 2
-  }
+  if (hashPart === validhashT) return 1
+  if (hashPart === validhashO) return 2
+
   return 0
 }
diff --git a/util/mc_lang.js b/util/mc_lang.js
index e761b70..07713d9 100755
--- a/util/mc_lang.js
+++ b/util/mc_lang.js
@@ -1,5 +1,5 @@
 import MinecraftData from 'minecraft-data'
-const _lang = MinecraftData('1.20.6').language
+const _lang = MinecraftData('1.21.1').language
 const lang = Object.create(null) // Without constructor function
 for (const i in _lang) {
   lang[i] = _lang[i]
diff --git a/util/memoryconvert.js b/util/memoryconvert.js
index 267520c..0b67cee 100644
--- a/util/memoryconvert.js
+++ b/util/memoryconvert.js
@@ -1,15 +1,16 @@
+const UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
+const THRESHOLD = 1000; // KiB = 1024; KB = 1000
+
 export default function memoryconvert (bytes) {
-  if (bytes >= 1125899906842624) { // Petabytes
-    return `${Math.round(bytes / 1125899906842624 * 100) / 100} PB`
-  } else if (bytes >= 1099511627776) { // Terabytes
-    return `${Math.round(bytes / 1099511627776 * 100) / 100} TB`
-  } else if (bytes >= 1073741824) { // Gigabytes
-    return `${Math.round(bytes / 1073741824 * 100) / 100} GB`
-  } else if (bytes >= 1048576) { // Megabytes
-    return `${Math.round(bytes / 1048576 * 100) / 100} MB`
-  } else if (bytes >= 1024) { // Kilobytes
-    return `${Math.round(bytes / 1024 * 100) / 100} KB`
-  } else { // Bytes
-    return `${bytes} B`
+  for (let i = 0; i < UNITS.length; i++) {
+    const last = i === (UNITS.length - 1);
+    const max = THRESHOLD ** (i + 1);
+    if (!last && bytes >= max) continue;
+
+    const divisor = THRESHOLD ** i;
+    const unit = UNITS[i];
+
+    const div = bytes / divisor;
+    return `${+div.toFixed(2)} ${unit}`
   }
 }