PrismarineJS minefalayer-pathfinder - бот игнорирует правила движения в течение первых нескольких секунд до целиJavascript

Форум по Javascript
Ответить
Anonymous
 PrismarineJS minefalayer-pathfinder - бот игнорирует правила движения в течение первых нескольких секунд до цели

Сообщение Anonymous »

Я работаю над ботом Minecraft на JavaScript, используя Mineflayer-Pathfinder.
Я наблюдаю странное поведение. Прежде чем вызвать bot.pathfinder.setGoal(), я устанавливаю правила движения с помощью pathfinder.setMovements(). Однако когда я это делаю, кажется, что боту требуется несколько секунд, чтобы правила движения действительно обновились. В течение первых нескольких секунд, пока бот достигает своей цели, он бежит и выполняет дикие паркурные движения, чтобы добраться до цели. Это приводит к тому, что бот очень сильно застревает на сервере и сбивает его с пути. Затем внезапно он начинает следовать установленным мной правилам. Медленная ходьба, отсутствие паркура и т. д.
Временное решение, которое я нашел, заключалось в том, чтобы просто установить задержку перед вызовом setGoal. Я обнаружил, что боту может потребоваться не менее 2 секунд, чтобы подчиниться установленным правилам. Однако тот факт, что я использую тайминг для чего-то подобного, говорит мне о том, что я, вероятно, сделал что-то критически неправильное.
Одна вещь, которую я пробовал, — это дождаться path_update или path_reset после установки движений, но, похоже, это никогда не срабатывает....

Код: Выделить всё

await new Promise(res => bot.once('path_reset', res));
Нигде больше в моей кодовой базе я не устанавливаю для движений что-либо отличное от правил, которые я установил в моем buildConstrainedMovments().

Код: Выделить всё

// helper to construct Movments
export function buildConstrainedMovements(bot, mcData) {
const m = new Movements(bot, mcData);
m.canDig = false;
m.allowWater = false;
m.allowSprinting = false;
m.allow1by1towers = false;
m.allowParkour = false;
m.canOpenDoors = true;
m.maxDropDown = 5;

if (!m.blocksToAvoid) m.blocksToAvoid = new Set();
const avoidNames = [
'cobweb','sweet_berry_bush','powder_snow','campfire','soul_campfire','fire','magma_block','scaffolding',
...Object.keys(mcData.blocksByName).filter(n => /trapdoor/.test(n))
];
for (const name of avoidNames) {
const b = mcData.blocksByName[name];
if (b) m.blocksToAvoid.add(b.id);
}
m.liquidCost = 100;
return m;
}

// Child functions of makePearlPuller
/**
* Create a pearl-pulling helper bound to a bot instance.
* Usage:
*   const pullPearl = makePearlPuller(bot, cfg, logger);
*   await pullPearl('Notch', { x: 0, y: 64, z: 0 });
*/
export function makePearlPuller(bot, cfg, logger) {

// Helper functions...
bot.on('goal_reached', async (goal) => {
if (!activePull) return;
// Handle goal reached...
});

return async function pullPearl(username, homeCoords) { //  {
_resolvePearlRun = resolveOuter; // scope in parent function

try {
const moves = await buildConstrainedMovements(bot, mcData);
await bot.pathfinder.setMovements(moves);

// ... Here I figure out where the coordinates to an active ender pearl is, and populate best with the coordinates

// For some reason, if I don't wait a couple seconds, the bot ignores the movement rules set and starts sprinting,
// doing parkour, etc.
// bot.pathfinder.setGoal(new GoalNear(best.x, best.y, best.z, 2)); 

Подробнее здесь: [url]https://stackoverflow.com/questions/79788739/prismarinejs-mineflayer-pathfinder-bot-ignores-movement-rules-for-first-few-se[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»