Compare commits
	
		
			24 Commits
		
	
	
		
			nogameplay
			...
			b1dab1968c
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | b1dab1968c | ||
|  | 3219ec6155 | ||
|  | f38ad8c819 | ||
|  | 4b8a39d38c | ||
|  | 6b71de0356 | ||
|  | 96214ffe37 | ||
|  | 034f8d331a | ||
|  | 69d0f5830d | ||
|  | 8e719d5ccf | ||
|  | 112eb04a8d | ||
|  | ba7c53be0c | ||
|  | 5b4718fa5d | ||
|  | 902732c6dd | ||
|  | 65d13a3379 | ||
|  | 288b7045b6 | ||
|  | 94574a4296 | ||
|  | 68e60921b1 | ||
|  | f2281a7cb3 | ||
|  | e9f2080556 | ||
|  | 086251bce6 | ||
|  | 0ae961521f | ||
|  | eae4e95803 | ||
|  | fb066ee8a5 | ||
|  | f4445749e6 | 
							
								
								
									
										36
									
								
								lib/index.js
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								lib/index.js
									
									
									
									
									
								
							| @@ -9,19 +9,22 @@ let cfg = { | ||||
| const mineflayer = require("mineflayer"); | ||||
| // const { createGetAccessor } = require('typescript'); | ||||
|  | ||||
| const bot = | ||||
|     !isNaN(parseInt(process.argv[3])) && parseInt(process.argv[3]) > 1e2 ? | ||||
|         mineflayer.createBot({ | ||||
|             host: process.argv[2] || process.env.MINECRAFT_HOST || env.MINECRAFT_HOST || 'localhost',  // Change this to the ip you want. | ||||
|             port: parseInt(process.argv[3]) || process.env.MINECRAFT_PORT || env.MINECRAFT_PORT // || 58471, | ||||
|         }) | ||||
|         : | ||||
|         mineflayer.createBot({ | ||||
|             host: process.argv[2] || process.env.MINECRAFT_HOST || env.MINECRAFT_HOST || 'localhost',  // Change this to the ip you want. | ||||
|             username: process.argv[3] || process.env.MINECRAFT_USER || env.MINECRAFT_USER, | ||||
|             password: process.argv[4] || process.env.MINECRAFT_PASS || env.MINECRAFT_PASS, | ||||
|             // port: process.argv[5] || process.env.MINECRAFT_PORT || 58471, | ||||
|         }) | ||||
| const options = !isNaN(parseInt(process.argv[3])) && parseInt(process.argv[3]) > 1e2 ? | ||||
|     { | ||||
|         host: process.argv[2] || process.env.MINECRAFT_HOST || env.MINECRAFT_HOST || 'localhost',  // Change this to the ip you want. | ||||
|         port: parseInt(process.argv[3]) || process.env.MINECRAFT_PORT || env.MINECRAFT_PORT // || 58471, | ||||
|     } | ||||
|     : | ||||
|     { | ||||
|         host: process.argv[2] || process.env.MINECRAFT_HOST || env.MINECRAFT_HOST || 'localhost',  // Change this to the ip you want. | ||||
|         username: process.argv[3] || process.env.MINECRAFT_USER || env.MINECRAFT_USER, | ||||
|         password: process.argv[4] || process.env.MINECRAFT_PASS || env.MINECRAFT_PASS, | ||||
|         // port: process.argv[5] || process.env.MINECRAFT_PORT || 58471, | ||||
|     } | ||||
|  | ||||
| const bot = mineflayer.createBot(options) | ||||
|  | ||||
| cfg.botOptions = options | ||||
|  | ||||
|  | ||||
| let plugins = {} | ||||
| @@ -92,13 +95,14 @@ cfg.quiet = true | ||||
| bot.once("spawn", () => { | ||||
|     plugins = { | ||||
|         command: require('./plugins/command'), | ||||
|         eater: require('./plugins/eater'), | ||||
|         inventory: require('./plugins/inventory'), | ||||
|         informer: require('./plugins/informer'), | ||||
|         finder: require('./plugins/finder'), | ||||
|         sleeper: require('./plugins/sleeper'), | ||||
|         armor: require('./plugins/armor'), | ||||
|         mover: require('./plugins/mover'), | ||||
|         guard: require('./plugins/guard'), | ||||
|         inventory: require('./plugins/inventory'), | ||||
|         eater: require('./plugins/eater'), | ||||
|         finder: require('./plugins/finder'), | ||||
|         // miner: require('./plugins/miner.js'), | ||||
|         // statemachine: require('./plugins/statemachine'), | ||||
|     } | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| const v = require('vec3') | ||||
| let mcData = require('minecraft-data') | ||||
| let mcData | ||||
|  | ||||
| let cfg = {} | ||||
| let bot = {} | ||||
| @@ -46,7 +46,17 @@ const events = { | ||||
|         } | ||||
|     } | ||||
|     , chat: command | ||||
|     , kicked: (reason, loggedIn) => console.warn(reason, loggedIn) | ||||
|     , kicked: function rejoin(reason, loggedIn) { | ||||
|         console.warn(reason, loggedIn && "logged_in") | ||||
|         if (reason.extra && reason.extra[0].text === "Server closed") { | ||||
|             bot.quit() | ||||
|             bot.end() | ||||
|             // TODO implement all startup features (maybe refactor all into a single function / module?) | ||||
|             setTimeout((bot, cfg) => { | ||||
|                 bot = mineflayer.createBot(cfg.botOptions) | ||||
|             }, 15 * 60 * 1000, bot, cfg); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| const events_registered = [] | ||||
| @@ -183,10 +193,17 @@ function command(username, message) { | ||||
|                     break; | ||||
|  | ||||
|                 case "follow": | ||||
|                     subcommand("go follow me") | ||||
|                     subcommand("go follow " + message_parts.slice(1).join(" ")) | ||||
|                     break; | ||||
|                 case "come": | ||||
|                     subcommand("go follow once") | ||||
|                     switch (message_parts[1]) { | ||||
|                         case "close": | ||||
|                         case "closer": | ||||
|                             subcommand("go follow close") | ||||
|                             break | ||||
|                         default: | ||||
|                             subcommand("go follow once") | ||||
|                     } | ||||
|                     break; | ||||
|                 case "move": | ||||
|                 case "go": | ||||
| @@ -242,11 +259,14 @@ function command(username, message) { | ||||
|                                     cfg.plugins.mover.follow(bot.nearestEntity()) | ||||
|                                     break | ||||
|                                 case 1: | ||||
|                                     let dist = 3 | ||||
|                                     switch (message_parts2[0]) { | ||||
|                                         case "close": | ||||
|                                             dist = 1 | ||||
|                                         case "me": | ||||
|                                         case "once": | ||||
|                                             if (player) { | ||||
|                                                 cfg.plugins.mover.follow(player, message_parts2[0] !== "once") | ||||
|                                                 cfg.plugins.mover.follow(player, message_parts2[0] === "me", dist) | ||||
|                                             } else { | ||||
|                                                 cfg.quiet || bot.chat("can't see you") | ||||
|                                             } | ||||
| @@ -331,6 +351,8 @@ function command(username, message) { | ||||
|                             break; | ||||
|                     } | ||||
|                     break | ||||
|                 // TODO move look (and maybe find) to informer plugin? | ||||
|                 case "look": | ||||
|                 case "lookat": | ||||
|                     // const coords = v(message_parts.splice(1)) | ||||
|                     switch (message_parts.length) { | ||||
| @@ -349,13 +371,12 @@ function command(username, message) { | ||||
|  | ||||
|                                 case "this": | ||||
|                                     // TODO lookat the block the user is looking at | ||||
|                                     // Currently looks player position | ||||
|                                     if (player) { | ||||
|                                         bot.lookAt((new v.Vec3(0, 1, 0)).add(player.position)) | ||||
|                                         todo() | ||||
|                                         bot.lookAt(player.position) | ||||
|                                     } else { | ||||
|                                         cfg.quiet || bot.chat("can't see you") | ||||
|                                     } | ||||
|                                     break; | ||||
|                                     break | ||||
|                                 default: | ||||
|                                     const aPlayer = bot.players[message_parts[2]] ? bot.players[message_parts[2]].entity : null | ||||
| @@ -375,6 +396,9 @@ function command(username, message) { | ||||
|                             break | ||||
|                     } | ||||
|                     break | ||||
|                 case "info": | ||||
|                     cfg.plugins.informer.command(message_parts.splice(1)) | ||||
|                     break | ||||
|                 case "ride": | ||||
|                 case "mount": | ||||
|                     bot.mount(bot.nearestEntity()) | ||||
| @@ -416,29 +440,52 @@ function command(username, message) { | ||||
|                 // case "take": | ||||
|                 //     // TODO take only what's requested, then throw all the rest | ||||
|                 //     // TODO take all | ||||
|                 // case "toss": | ||||
|                 // case "drop": | ||||
|                 //     if (!message_parts[1]) { return false } // FIXME, works but ugly | ||||
|                 //     if (!checkItemExists(message_parts[1])) { return false } | ||||
|                 //     switch (message_parts.length) { | ||||
|                 //         case 2: | ||||
|                 //             bot.toss(mcData.blocksByName[message_parts[1]].id) | ||||
|                 //             break | ||||
|                 //         case 3: | ||||
|                 //             bot.tossStack( | ||||
|                 //                 mcData.itemsByName[message_parts[1]].id, | ||||
|                 //                 (err) => { | ||||
|                 //                     if (err) { | ||||
|                 //                         console.log(err) | ||||
|                 //                         bot.chat(err) | ||||
|                 //                     } | ||||
|                 //                 } | ||||
|                 //             ) | ||||
|                 //             break | ||||
|                 //         default: | ||||
|                 //             break | ||||
|                 //     } | ||||
|                 //     break; | ||||
|  | ||||
|                 // TODO move subcommands to cfg.plugins.inventory.itemByName | ||||
|                 case "toss": | ||||
|                 case "drop": | ||||
|                     if (!message_parts[1]) { return false } // FIXME, works but ugly | ||||
|                     if (!mcData.findItemOrBlockByName(message_parts[1])) { | ||||
|                         console.log("doesn't exist:", message_parts[1]) | ||||
|                         cfg.quiet || bot.chat(`item doesn't exist: ${message_parts[1]}`) | ||||
|                         return false | ||||
|                     } | ||||
|                     const item = cfg.plugins.inventory.itemByName(message_parts[1]) | ||||
|                     if (!item) { | ||||
|                         console.log("don't have:", message_parts[1]) | ||||
|                         cfg.quiet || bot.chat(`don't have item: ${message_parts[1]}`) | ||||
|                         return false | ||||
|                     } | ||||
|                     switch (message_parts.length) { | ||||
|                         case 2: | ||||
|                             bot.tossStack( | ||||
|                                 item, | ||||
|                                 (err) => { | ||||
|                                     if (err) { | ||||
|                                         console.error(err) | ||||
|                                         cfg.quiet || bot.chat(err.message) | ||||
|                                     } | ||||
|                                 } | ||||
|                             ) | ||||
|                             break | ||||
|                         case 3: | ||||
|                             const amount = parseInt(message_parts[2]) | ||||
|                             bot.toss( | ||||
|                                 item.type, | ||||
|                                 null, //metadata | ||||
|                                 amount, | ||||
|                                 (err) => { | ||||
|                                     if (err) { | ||||
|                                         console.error(err) | ||||
|                                         cfg.quiet || bot.chat(err.message) | ||||
|                                     } | ||||
|                                 } | ||||
|                             ) | ||||
|                             break | ||||
|                         default: | ||||
|                             break | ||||
|                     } | ||||
|                     break; | ||||
|                 case "location": | ||||
|                     // TODO put in /lib/location | ||||
|                     switch (message_parts[1]) { | ||||
| @@ -537,13 +584,12 @@ const load = (config) => { | ||||
|     cfg = config | ||||
|     bot = cfg.bot | ||||
|  | ||||
|     mcData = mcData(bot.version) | ||||
|     mcData = bot.mcData || (bot.mcData = require('minecraft-data')(bot.version)) | ||||
|     for (const [key, fn] of Object.entries(events)) { | ||||
|         events_registered.push( | ||||
|             bot.on(key, fn) | ||||
|         ) | ||||
|     } | ||||
|     mcData = require('minecraft-data')(bot.version) | ||||
| } | ||||
|  | ||||
| const unload = () => { | ||||
|   | ||||
							
								
								
									
										42
									
								
								lib/plugins/informer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								lib/plugins/informer.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| let cfg | ||||
| let bot | ||||
| let mcData | ||||
|  | ||||
| function block() { | ||||
|     const block = bot.blockAtCursor() | ||||
|     console.log(block) | ||||
|     let info = [block.type, block.name] | ||||
|     if (block.metadata) info.push(block.metadata) | ||||
|     cfg.quiet || bot.chat(info.join(": ")) | ||||
| } | ||||
|  | ||||
| function command(message_parts) { | ||||
|     switch (message_parts.length) { | ||||
|         case 0: | ||||
|         case 1: | ||||
|             switch (message_parts[0]) { | ||||
|                 case "block": | ||||
|                 default: | ||||
|                     block() | ||||
|                     break; | ||||
|             } | ||||
|  | ||||
|             break; | ||||
|  | ||||
|         default: | ||||
|             break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| const load = (config) => { | ||||
|     cfg = config | ||||
|     bot = cfg.bot | ||||
|     cfg.info = { | ||||
|         quiet: cfg.quiet, | ||||
|     } | ||||
|     mcData = bot.mcData || (bot.mcData = require('minecraft-data')(bot.version)) | ||||
| } | ||||
|  | ||||
| const unload = () => {} | ||||
|  | ||||
| module.exports = { load, unload, command, block } | ||||
| @@ -225,4 +225,4 @@ const unload = () => { | ||||
|     bot.off('chat', inventory) | ||||
| } | ||||
|  | ||||
| module.exports = { load, unload, equipItem, craftItem } | ||||
| module.exports = { load, unload, equipItem, craftItem, itemByName } | ||||
| @@ -1,27 +1,28 @@ | ||||
| // import { EntityFilters } from "mineflayer-statemachine" | ||||
| // import v from "vec3" | ||||
|  | ||||
| // import { Movements } from "mineflayer-pathfinder" | ||||
|  | ||||
| // const mineflayer = require('mineflayer') | ||||
| const { Movements } = require('mineflayer-pathfinder') | ||||
| // const { GoalBLah } = require('mineflayer-pathfinder').goals | ||||
| const v = require('vec3') | ||||
|  | ||||
| let cfg = {} | ||||
| let bot = {} | ||||
| // let moving | ||||
| let pathfinder | ||||
| let mcData | ||||
| let movements = [] | ||||
|  | ||||
|  | ||||
| function initMoves(bot = bot, mcData = require('minecraft-data')(bot.version)) { | ||||
| function initMoves(bot = bot, mcData = bot.mcData) { | ||||
|     console.info(movements) | ||||
|     if (movements.length > 0) { | ||||
|         bot.pathfinder.setMovements(movements.defaultMove) | ||||
|         return console.warn("movements already initialized!") | ||||
|     } | ||||
|     let defaultMove = new Movements(bot, mcData) | ||||
|     defaultMove.canDig = false | ||||
|     defaultMove.scafoldingBlocks.push(mcData.blocksByName.slime_block.id) | ||||
|     // defaultMove.blocksCantBreak.add(mcData.blocksByName.glass.id) | ||||
|     // defaultMove.blocksToAvoid.add(mcData.blocksByName.magma.id) | ||||
|     movements.defaultMove = defaultMove | ||||
|     defaultMove.blocksCantBreak.add(mcData.blocksByName.glass.id) | ||||
|     defaultMove.blocksToAvoid.add(mcData.blocksByName.magma_block.id) | ||||
|     movements.push(defaultMove) | ||||
|     movements.defaultMove = movements[0] | ||||
|  | ||||
|     bot.pathfinder.setMovements(defaultMove) | ||||
| } | ||||
| @@ -36,12 +37,10 @@ function moveNear(pos, distance = 3) { | ||||
|     bot.pathfinder.setGoal(new GoalNear(pos.x, pos.y, pos.z, distance)) | ||||
| } | ||||
|  | ||||
| function follow(entity, dynamic = true) { | ||||
| function follow(entity, dynamic = true, distance = 3) { | ||||
|     console.assert(entity) | ||||
|     const { GoalFollow } = require('mineflayer-pathfinder').goals | ||||
|  | ||||
|  | ||||
|  | ||||
|     cfg.quiet && console.log(entity) | ||||
|         || bot.chat( | ||||
|             `following ${entity.type | ||||
| @@ -54,7 +53,7 @@ function follow(entity, dynamic = true) { | ||||
|     // console.log(entity) | ||||
|  | ||||
|     bot.pathfinder.setMovements(movements.defaultMove) | ||||
|     bot.pathfinder.setGoal(new GoalFollow(entity, 3), dynamic) | ||||
|     bot.pathfinder.setGoal(new GoalFollow(entity, distance), dynamic) | ||||
| } | ||||
|  | ||||
| function hit(blockOrEntity) { | ||||
| @@ -77,19 +76,16 @@ const load = (config) => { | ||||
|         movements: [] | ||||
|     } | ||||
|  | ||||
|     mcData = bot.mcData || (bot.mcData = require('minecraft-data')(bot.version)) | ||||
|     pathfinder = bot.pathfinder || bot.loadPlugin(require('mineflayer-pathfinder').pathfinder) | ||||
|  | ||||
|     // initMoves(bot, mcData) | ||||
|     setTimeout(initMoves, 500, bot) | ||||
|  | ||||
|     // bot.loadPlugin(pathfinder) | ||||
|  | ||||
|     // bot.on('time', hello) | ||||
|     setTimeout(initMoves, 500, bot, mcData) | ||||
|  | ||||
| } | ||||
|  | ||||
| const unload = () => { | ||||
|     // TODO stop pathfinding maybe? | ||||
|     stop() | ||||
| } | ||||
|  | ||||
| module.exports = { load, unload, stop, initMoves, moveNear, follow } | ||||
| @@ -7,49 +7,75 @@ let bot = {} | ||||
| let inv | ||||
| // cfg.autosleep = false | ||||
|  | ||||
| function sleep(quiet) { | ||||
|     quiet = quiet !== undefined ? quiet : cfg.sleep.quiet | ||||
| function sleep(quiet = cfg.sleep.quiet) { | ||||
|     if(bot.game.dimension !== "minecraft:overworld" || cfg.sleep.force){ | ||||
|         !quiet && bot.chat("can't sleep, not in overworld now") | ||||
|         return | ||||
|     } | ||||
|     if (bot.isSleeping && !cfg.sleep.force) { | ||||
|         !quiet && bot.chat("already in bed!") | ||||
|         return | ||||
|     } | ||||
|     let bed = bot.findBlock({ | ||||
|         matching: block => bot.isABed(block) | ||||
|     }) | ||||
|     let bedstatus = bed && bot.parseBedMetadata(bed).occupied ? "n unoccupied" : "" | ||||
|     if(bed && bedstatus == "n unoccupied"){ | ||||
|     let bed_occupied = bed && bot.parseBedMetadata(bed).occupied | ||||
|     if (bed && bed_occupied) { | ||||
|         bot.lookAt(bed.position) | ||||
|         bed = bot.findBlock({ | ||||
|             matching: block => bot.isABed(block) && !bot.parseBedMetadata(block).occupied | ||||
|         }) || bed | ||||
|         bedstatus = bot.parseBedMetadata(bed).occupied ? "n unoccupied" : "" | ||||
|         bed_occupied = bot.parseBedMetadata(bed).occupied | ||||
|     } | ||||
|     if (bed && bedstatus == "") { | ||||
|     if (bed && !bed_occupied) { | ||||
|         bot.lookAt(bed.position) | ||||
|         bot.waitForChunksToLoad(() => { | ||||
|             cfg.plugins.moveNear(bed.position) | ||||
|             bot.sleep(bed, (err) => { | ||||
|                 if (err) { | ||||
|                     !quiet && bot.chat(`can't sleep: ${err.message}`) | ||||
|                 } else { | ||||
|                     !quiet && bot.chat("zzz") | ||||
|                     console.log("sleeping? ", bot.isSleeping) | ||||
|                     // hack until this is fixed | ||||
|                     // bot.isSleeping = bot.isSleeping ? bot.isSleeping : true | ||||
|                     bot.isSleeping = true | ||||
|                 } | ||||
|             cfg.plugins.mover && cfg.plugins.mover.moveNear(bed.position, 2) | ||||
|             bot.once('goal_reached', (goal) => { | ||||
|                 console.info(goal) | ||||
|                 bot.sleep(bed, (err) => { | ||||
|                     if (err) { | ||||
|                         !quiet && bot.chat(`can't sleep: ${err.message}`) | ||||
|                     } else { | ||||
|                         !quiet && bot.chat("zzz") | ||||
|                         console.log("sleeping? ", bot.isSleeping) | ||||
|                         // hack until this is fixed | ||||
|                         // TODO confirm this is fixed | ||||
|                         // bot.isSleeping = true | ||||
|                     } | ||||
|                 }) | ||||
|             }) | ||||
|         }) | ||||
|     } else if (inv && inv.equipItem("red_bed", "hand", true)) { | ||||
|         // doesn't work fortunately | ||||
|         // FIXME: DONT IMPLEMENT until it is detected as NOT NETHER | ||||
|         // bot.placeBlock() | ||||
|     } else if (bed = bot.inventory.items().filter(bot.isABed)[0]) { | ||||
|         const v = require('vec3') | ||||
|         bot.equip(bed, "hand", (err) => { if (err) console.error(err) }) | ||||
|         bot.waitForChunksToLoad(() => { | ||||
|             let refBlock = | ||||
|                 // FIXME hack to get around findBlock returning null | ||||
|                 bot.blockAt(bot.entity.position.offset(1, 0, 1), false) | ||||
|             // bot.findBlock({ | ||||
|             //     matching: (block) => { | ||||
|             //         // if (block && block.type !== 0 && block.position) { | ||||
|             //         if (block && block.position) { | ||||
|             //             console.info("found", block) | ||||
|             //             const blockAbove = bot.blockAt(block.position.offset(0, 1, 0)) | ||||
|             //             return !blockAbove || blockAbove.type === 0 | ||||
|             //         } | ||||
|             //         // console.info("not found", block) | ||||
|             //         return false | ||||
|             //     } | ||||
|             //     , maxDistance: 10 | ||||
|             // }) | ||||
|             console.log(refBlock) | ||||
|             bot.placeBlock(refBlock, new v.Vec3(0, 1, 0), console.error) | ||||
|             setTimeout(sleep, 3000, true) | ||||
|         }) | ||||
|     } else { | ||||
|         // TODO: use mover | ||||
|         // bot.gameplay.solveFor( | ||||
|         //     new ObtainItem("bed"), (err) => { | ||||
|         //         if (err) { | ||||
|         //             !quiet && bot.chat(`need a${bedstatus} bed: may not see if just placed`) | ||||
|         !quiet && bot.chat(`need a${bed_occupied ? "n unoccupied" : ""} bed: may not see if just placed`) | ||||
|         //         } | ||||
|         //     } | ||||
|         // ) | ||||
| @@ -72,7 +98,7 @@ function autoSleep() { | ||||
|     if (!bot.time.isDay && !cfg.sleep.timeoutFn && cfg.sleep.auto && !bot.isSleeping) { | ||||
|         sleep() | ||||
|         cfg.sleep.timeoutFn = setTimeout(() => { cfg.sleep.timeoutFn = null }, cfg.sleep.timeout) | ||||
|         console.log("sleeping?", bot.isSleeping, bot.time) | ||||
|         console.log("sleeping?", bot.isSleeping, bot.time.isDay, bot.time.timeOfDay) | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										22
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								package.json
									
									
									
									
									
								
							| @@ -34,20 +34,20 @@ | ||||
|     "require-self": "^0.2.3" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "dotenv-packed": "^1.2.1", | ||||
|     "minecraft-data": "^2.70.2", | ||||
|     "mineflayer": "^2.34.0", | ||||
|     "mineflayer-armor-manager": "^1.3", | ||||
|     "mineflayer-pathfinder": "^1.1", | ||||
|     "mineflayer-pvp": "^1", | ||||
|     "prismarine-block": "^1", | ||||
|     "prismarine-chat": "^1", | ||||
|     "mineflayer": "^2.39.2", | ||||
|     "mineflayer-armor-manager": "^1.3.0", | ||||
|     "mineflayer-pathfinder": "^1.2.3", | ||||
|     "mineflayer-pvp": "^1.0.2", | ||||
|     "prismarine-block": "^1.7.2", | ||||
|     "prismarine-chat": "^1.0.3", | ||||
|     "prismarine-entity": "^1.1.0", | ||||
|     "prismarine-item": "^1.5.0", | ||||
|     "prismarine-nbt": "^1.3", | ||||
|     "prismarine-recipe": "^1", | ||||
|     "typescript": "^4", | ||||
|     "vec3": "^0.1", | ||||
|     "dotenv-packed": "^1.2" | ||||
|     "prismarine-nbt": "^1.3.0", | ||||
|     "prismarine-recipe": "^1.1.0", | ||||
|     "typescript": "^4.1.3", | ||||
|     "vec3": "^0.1.7" | ||||
|   }, | ||||
|   "files": [ | ||||
|     "lib/**/*" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user