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));
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));
Mobile version