diff --git a/lib/plugins/mover.js b/lib/plugins/mover.js index 838f5cd..fea7fe0 100644 --- a/lib/plugins/mover.js +++ b/lib/plugins/mover.js @@ -82,6 +82,66 @@ function follow(entity, dynamic = true, distance = 3) { bot.pathfinder.setGoal(new GoalFollow(entity, distance), dynamic) } +function away(entity = bot.nearestEntity(), invertInvert = true, dynamic = true, distance = 10) { + const currentGoal = bot.pathfinder.goal + console.assert(currentGoal || entity) + const { GoalInvert } = require('mineflayer-pathfinder').goals + + bot.pathfinder.setMovements(movements.defaultMove) + + if (!currentGoal) { + const { GoalFollow } = require('mineflayer-pathfinder').goals + + if (entity.entity) { + console.log("go away entity:", entity, entity.entity) + entity = entity.entity + } + + cfg.quiet || bot.chat( + `going away from ${entity?.type + }: ${entity?.username || entity?.displayName + }${dynamic ? "" : " once"}` + ) + // alternative implementation + // follow(entity, dynamic, distance) + // bot.pathfinder.setGoal(new GoalInvert(bot.pathfinder.goal), dynamic) + return bot.pathfinder.setGoal(new GoalInvert( + new GoalFollow(entity, distance) + ), dynamic) + } + + if (currentGoal instanceof GoalInvert) { + const currEntity = currentGoal.goal.entity + console.log("go away inverse goal:", currentGoal.goal) + if (invertInvert) { + cfg.quiet || bot.chat( + `switching towards ${currentGoal.goal?.constructor.name + }: ${currEntity?.type + }: ${currEntity?.username || currEntity?.displayName + }${dynamic ? "" : " once"}` + ) + bot.pathfinder.setGoal(currentGoal.goal, dynamic) + } else { + cfg.quiet || bot.chat( + `already going away from ${currentGoal.goal?.constructor.name + }; not switching` + ) + } + } else { + const currEntity = currentGoal.entity + console.log("go away goal:", currentGoal) + cfg.quiet || bot.chat( + `going away from ${currentGoal?.constructor.name + }: ${currEntity?.type + }: ${currEntity?.username || currEntity?.displayName + }${dynamic ? "" : " once"}` + ) + bot.pathfinder.setGoal(new GoalInvert(currentGoal), dynamic) + } + + +} + function ride(entity) { entity = entity?.entity || entity const ridableMobs = ["Horse", "Donkey", "Pig", "Strider"] @@ -230,6 +290,11 @@ function command(message_parts, player) { case "mount": ride(message_parts2[0]) break + case "away": + case "run": + case "runaway": + away() + break case "w": case "f": moveOrRide(0, -1, "forward", message_parts2)