File size: 2,617 Bytes
36ba3ef |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
// Explore downward for 60 seconds: exploreUntil(bot, new Vec3(0, -1, 0), 60);
async function exploreUntil(
bot,
direction,
maxTime = 60,
callback = () => {
return false;
}
) {
if (typeof maxTime !== "number") {
throw new Error("maxTime must be a number");
}
if (typeof callback !== "function") {
throw new Error("callback must be a function");
}
const test = callback();
if (test) {
bot.chat("Explore success.");
return Promise.resolve(test);
}
if (direction.x === 0 && direction.y === 0 && direction.z === 0) {
throw new Error("direction cannot be 0, 0, 0");
}
if (
!(
(direction.x === 0 || direction.x === 1 || direction.x === -1) &&
(direction.y === 0 || direction.y === 1 || direction.y === -1) &&
(direction.z === 0 || direction.z === 1 || direction.z === -1)
)
) {
throw new Error(
"direction must be a Vec3 only with value of -1, 0 or 1"
);
}
maxTime = Math.min(maxTime, 1200);
return new Promise((resolve, reject) => {
const dx = direction.x;
const dy = direction.y;
const dz = direction.z;
let explorationInterval;
let maxTimeTimeout;
const cleanUp = () => {
clearInterval(explorationInterval);
clearTimeout(maxTimeTimeout);
bot.pathfinder.setGoal(null);
};
const explore = () => {
const x =
bot.entity.position.x +
Math.floor(Math.random() * 20 + 10) * dx;
const y =
bot.entity.position.y +
Math.floor(Math.random() * 20 + 10) * dy;
const z =
bot.entity.position.z +
Math.floor(Math.random() * 20 + 10) * dz;
let goal = new GoalNear(x, y, z);
if (dy === 0) {
goal = new GoalNearXZ(x, z);
}
bot.pathfinder.setGoal(goal);
try {
const result = callback();
if (result) {
cleanUp();
bot.chat("Explore success.");
resolve(result);
}
} catch (err) {
cleanUp();
reject(err);
}
};
explorationInterval = setInterval(explore, 2000);
maxTimeTimeout = setTimeout(() => {
cleanUp();
bot.chat("Max exploration time reached");
resolve(null);
}, maxTime * 1000);
});
}
|