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