From a7ebe00929056d1f8a53d3a28e144b2d2f34a8f4 Mon Sep 17 00:00:00 2001 From: Kolby Nottingham Date: Wed, 6 Mar 2024 15:22:34 -0800 Subject: [PATCH] crafting bugs --- src/agent/library/world.js | 60 ++++++++++++------------- src/agent/npc/construction/shelter.json | 2 +- src/agent/npc/utils.js | 9 ++-- src/utils/mcdata.js | 16 +++++++ 4 files changed, 50 insertions(+), 37 deletions(-) diff --git a/src/agent/library/world.js b/src/agent/library/world.js index 2c7aa5e..9d6be62 100644 --- a/src/agent/library/world.js +++ b/src/agent/library/world.js @@ -1,5 +1,5 @@ import pf from 'mineflayer-pathfinder'; -import { getAllBlockIds, getAllBiomes } from '../../utils/mcdata.js'; +import * as mc from '../../utils/mcdata.js'; export function getNearestFreeSpace(bot, size=1, distance=8) { @@ -39,26 +39,7 @@ export function getNearestFreeSpace(bot, size=1, distance=8) { } -export function getNearbyBlocks(bot, maxDistance, count=null) { - if (maxDistance == null) maxDistance = 16; - if (count == null) count = 10000; - let positions = bot.findBlocks({matching: getAllBlockIds(['air']), maxDistance: maxDistance, count: count}); - let blocks = []; - for (let i = 0; i < positions.length; i++) { - let block = bot.blockAt(positions[i]); - let distance = positions[i].distanceTo(bot.entity.position); - blocks.push({ block: block, distance: distance }); - } - blocks.sort((a, b) => a.distance - b.distance); - let res = []; - for (let i = 0; i < blocks.length; i++) { - res.push(blocks[i].block); - } - return res; -} - - -export function getNearestBlocks(bot, block_types, distance=16, count=null) { +export function getNearestBlocks(bot, block_types=null, distance=16, count=10000) { /** * Get a list of the nearest blocks of the given types. * @param {Bot} bot - The bot to get the nearest block for. @@ -70,17 +51,32 @@ export function getNearestBlocks(bot, block_types, distance=16, count=null) { * let woodBlocks = world.getNearestBlocks(bot, ['oak_log', 'birch_log'], 16, 1); **/ // if blocktypes is not a list, make it a list - if (!Array.isArray(block_types)) - block_types = [block_types]; - let blocks = []; - for (let block of getNearbyBlocks(bot, distance, count)) { - if (block_types.includes(block.name)) { - blocks.push(block); - if (count !== null && blocks.length >= count) - break; + let block_ids = []; + if (block_types === null) { + block_ids = mc.getAllBlockIds(['air']); + } + else { + if (!Array.isArray(block_types)) + block_types = [block_types]; + for(let block_type of block_types) { + block_ids.push(mc.getBlockId(block_type)); } } - return blocks; + + let positions = bot.findBlocks({matching: block_ids, maxDistance: distance, count: count}); + let blocks = []; + for (let i = 0; i < positions.length; i++) { + let block = bot.blockAt(positions[i]); + let distance = positions[i].distanceTo(bot.entity.position); + blocks.push({ block: block, distance: distance }); + } + blocks.sort((a, b) => a.distance - b.distance); + + let res = []; + for (let i = 0; i < blocks.length; i++) { + res.push(blocks[i].block); + } + return res; } @@ -235,7 +231,7 @@ export function getNearbyBlockTypes(bot, distance=16) { * @example * let blocks = world.getNearbyBlockTypes(bot); **/ - let blocks = getNearbyBlocks(bot, distance); + let blocks = getNearestBlocks(bot, null, distance); let found = []; for (let i = 0; i < blocks.length; i++) { if (!found.includes(blocks[i].name)) { @@ -269,5 +265,5 @@ export function getBiomeName(bot) { * let biome = world.getBiomeName(bot); **/ const biomeId = bot.world.getBiome(bot.entity.position); - return getAllBiomes()[biomeId].name; + return mc.getAllBiomes()[biomeId].name; } diff --git a/src/agent/npc/construction/shelter.json b/src/agent/npc/construction/shelter.json index 1216665..410afb5 100644 --- a/src/agent/npc/construction/shelter.json +++ b/src/agent/npc/construction/shelter.json @@ -20,7 +20,7 @@ ], [ ["dirt", "dirt", "dirt", "dirt", "dirt"], - ["dirt", "air", "air", "air", "dirt"], + ["dirt", "chest", "air", "air", "dirt"], ["dirt", "air", "air", "air", "dirt"], ["dirt", "air", "air", "air", "dirt"], ["dirt", "dirt", "door", "dirt", "dirt"] diff --git a/src/agent/npc/utils.js b/src/agent/npc/utils.js index 10d1520..b63b544 100644 --- a/src/agent/npc/utils.js +++ b/src/agent/npc/utils.js @@ -27,10 +27,11 @@ export function getTypeOfGeneric(bot, block_name) { return max_type + '_' + block_name; // Return nearest wood type - let blocks = world.getNearbyBlocks(bot, 32); - for (const block of blocks) { - if (block.name.endsWith('log')) - return block.name.split('_')[0] + '_' + block_name; + let log_types = mc.WOOD_TYPES.map((wood) => wood + '_log'); + let blocks = world.getNearestBlocks(bot, log_types, 16, 1); + if (blocks.length > 0) { + let wood = blocks[0].name.split('_')[0]; + return wood + '_' + block_name; } // Return oak diff --git a/src/utils/mcdata.js b/src/utils/mcdata.js index 9908649..1ffbec7 100644 --- a/src/utils/mcdata.js +++ b/src/utils/mcdata.js @@ -75,6 +75,22 @@ export function getItemName(itemId) { return null; } +export function getBlockId(blockName) { + let block = mcdata.blocksByName[blockName]; + if (block) { + return block.id; + } + return null; +} + +export function getBlockName(blockId) { + let block = mcdata.blocks[blockId] + if (block) { + return block.name; + } + return null; +} + export function getAllItems(ignore) { if (!ignore) { ignore = [];