diff --git a/src/agent/commands/actions.js b/src/agent/commands/actions.js index 246d649..a80ad29 100644 --- a/src/agent/commands/actions.js +++ b/src/agent/commands/actions.js @@ -306,8 +306,9 @@ export const actionsList = [ { name: '!stay', description: 'Stay in the current location no matter what. Pauses all modes.', - perform: wrapExecution(async (agent) => { - await skills.stay(agent.bot); + params: {'type': { type: 'int', description: 'The number of seconds to stay. -1 for forever.', domain: [-1, Number.MAX_SAFE_INTEGER] }}, + perform: wrapExecution(async (agent, seconds) => { + await skills.stay(agent.bot, seconds); }) }, { diff --git a/src/agent/library/skills.js b/src/agent/library/skills.js index b9f6184..b575ff1 100644 --- a/src/agent/library/skills.js +++ b/src/agent/library/skills.js @@ -716,6 +716,9 @@ export async function equip(bot, itemName) { else if (itemName.includes('chestplate') || itemName.includes('elytra')) { await bot.equip(item, 'torso'); } + else if (itemName.includes('shield')) { + await bot.equip(item, 'off-hand'); + } else { await bot.equip(item, 'hand'); } @@ -1082,10 +1085,11 @@ export async function avoidEnemies(bot, distance=16) { return true; } -export async function stay(bot) { +export async function stay(bot, seconds=30) { /** * Stay in the current position until interrupted. Disables all modes. * @param {MinecraftBot} bot, reference to the minecraft bot. + * @param {number} seconds, the number of seconds to stay. Defaults to 30. -1 for indefinite. * @returns {Promise} true if the bot stayed, false otherwise. * @example * await skills.stay(bot); @@ -1097,9 +1101,11 @@ export async function stay(bot) { bot.modes.pause('hunting'); bot.modes.pause('torch_placing'); bot.modes.pause('item_collecting'); - while (!bot.interrupt_code) { + let start = Date.now(); + while (!bot.interrupt_code && (seconds === -1 || Date.now() - start < seconds*1000)) { await new Promise(resolve => setTimeout(resolve, 500)); } + log(bot, `Stayed for ${(Date.now() - start)/1000} seconds.`); return true; }