diff --git a/package.json b/package.json index b2912b1..79829e4 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "mineflayer-pvp": "^1.3.2", "openai": "^4.4.0", "patch-package": "^8.0.0", + "prismarine-item": "^1.14.0", "replicate": "^0.29.4", "vec3": "^0.1.10", "yargs": "^17.7.2" diff --git a/src/agent/library/skills.js b/src/agent/library/skills.js index 1dbe0fb..8e8411f 100644 --- a/src/agent/library/skills.js +++ b/src/agent/library/skills.js @@ -525,7 +525,7 @@ export async function placeBlock(bot, blockType, x, y, z, placeOn='bottom', dont blockType += `[facing=${face}]`; } } - if (blockType === 'repeater' || blockType === 'comparator') { + if (blockType === 'ladder' || blockType === 'repeater' || blockType === 'comparator') { blockType += `[facing=${face}]`; } @@ -540,6 +540,10 @@ export async function placeBlock(bot, blockType, x, y, z, placeOn='bottom', dont } let block = bot.inventory.items().find(item => item.name === blockType); + if (!block && bot.game.gameMode === 'creative') { + await bot.creative.setInventorySlot(36, mc.makeItem(blockType, 1)); // 36 is first hotbar slot + block = bot.inventory.items().find(item => item.name === blockType); + } if (!block) { log(bot, `Don't have any ${blockType} to place.`); return false; diff --git a/src/agent/library/world.js b/src/agent/library/world.js index 0e32014..dc64599 100644 --- a/src/agent/library/world.js +++ b/src/agent/library/world.js @@ -261,6 +261,8 @@ export function shouldPlaceTorch(bot) { const pos = getPosition(bot); // TODO: check light level instead of nearby torches, block.light is broken let nearest_torch = getNearestBlock(bot, 'torch', 6); + if (!nearest_torch) + nearest_torch = getNearestBlock(bot, 'wall_torch', 6); if (!nearest_torch) { const block = bot.blockAt(pos); let has_torch = bot.inventory.items().find(item => item.name === 'torch'); diff --git a/src/utils/mcdata.js b/src/utils/mcdata.js index ad83963..c260325 100644 --- a/src/utils/mcdata.js +++ b/src/utils/mcdata.js @@ -1,6 +1,7 @@ import minecraftData from 'minecraft-data'; import settings from '../../settings.js'; import { createBot } from 'mineflayer'; +import prismarine_items from 'prismarine-item'; import { pathfinder } from 'mineflayer-pathfinder'; import { plugin as pvp } from 'mineflayer-pvp'; import { plugin as collectblock } from 'mineflayer-collectblock'; @@ -10,7 +11,7 @@ const armorManager = plugin; const mc_version = settings.minecraft_version; const mcdata = minecraftData(mc_version); - +const Item = prismarine_items(mc_version); export const WOOD_TYPES = ['oak', 'spruce', 'birch', 'jungle', 'acacia', 'dark_oak']; export const MATCHING_WOOD_BLOCKS = [ @@ -236,4 +237,8 @@ export function getBlockTool(blockName) { return null; } return getItemName(Object.keys(block.harvestTools)[0]); // Double check first tool is always simplest +} + +export function makeItem(name, amount=1) { + return new Item(getItemId(name), amount); } \ No newline at end of file