feat(mover): ✨ add an action to move / run away from an entity or goal
based on `pathfinder` goal `GoalInvert`; behaves slightly strange
This commit is contained in:
		| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user