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