PrismarineJS mineflayer-pathfinder – Bot ignoriert Bewegungsregeln in den ersten paar Sekunden des ZielsJavaScript

Javascript-Forum
Anonymous
 PrismarineJS mineflayer-pathfinder – Bot ignoriert Bewegungsregeln in den ersten paar Sekunden des Ziels

Post by Anonymous »

Ich arbeite an einem Minecraft-Bot in JavaScript mit Mineflayer-Pathfinder.
Ich sehe seltsames Verhalten. Bevor ich bot.pathfinder.setGoal() aufrufe, lege ich die Bewegungsregeln mit pathfinder.setMovements() fest. Wenn ich das jedoch mache, scheint es, als würde der Bot ein paar Sekunden brauchen, bis die Bewegungsregeln tatsächlich aktualisiert werden. In den ersten paar Sekunden, während der Bot sein Ziel erreicht, sprintet er und führt wilde Parkour-Bewegungen aus, um zum Ziel zu gelangen. Dies führt dazu, dass der Bot auf dem Server stark blockiert wird und ihn aus der Bahn wirft. Dann beginnt es plötzlich, den von mir festgelegten Regeln zu folgen. Langsames Gehen, kein Parkour usw.
Die vorübergehende Problemumgehung, die ich gefunden habe, bestand darin, einfach eine Verzögerung festzulegen, bevor setGoal aufgerufen wurde. Ich habe festgestellt, dass es mindestens 2 Sekunden dauern kann, bis der Bot die festgelegten Regeln befolgt. Die Tatsache, dass ich für so etwas das Timing verwende, sagt mir jedoch, dass ich wahrscheinlich etwas kritisch falsch gemacht habe.
Ich habe versucht, nach dem Festlegen der Bewegungen auf ein path_update oder path_reset zu warten, aber es scheint nie ausgelöst zu werden....

Code: Select all

await new Promise(res => bot.once('path_reset', res));
Nirgendwo sonst in meiner Codebasis stelle ich die Bewegungen auf etwas anderes ein als die Regeln, die ich in meinem buildConstrainedMovments() festgelegt habe.

Code: Select all

// 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));

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post