Compare commits

..

5 Commits

Author SHA1 Message Date
jay
bf45a53f08 refactor: remove gameplay
temporarily remove gameplay until it is fixed and more stable

miner plugin won't work now
2020-12-24 10:40:46 +05:00
jay
a7ccb08d43 refactor: remove sleeper's prismarine-gameplay dependence 2020-12-24 10:35:01 +05:00
jay
8e4eb7748f style: fix crlf to lf 2020-12-24 09:33:08 +05:00
jay
47a944fe2a fix: 🐛 compat: don't use ?. for compat with older node.js 2020-12-24 09:19:32 +05:00
jay
1a3c345017 chore: 🙈 ignore .env 2020-12-24 09:16:11 +05:00
7 changed files with 257 additions and 274 deletions

1
.gitignore vendored
View File

@@ -13,6 +13,7 @@
# misc # misc
.DS_Store .DS_Store
.env
.env.local .env.local
.env.development.local .env.development.local
.env.test.local .env.test.local

56
.vscode/launch.json vendored
View File

@@ -1,29 +1,29 @@
{ {
// Use IntelliSense to learn about possible attributes. // Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes. // Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
"type": "node", "type": "node",
"request": "launch", "request": "launch",
"name": "protospace", "name": "protospace",
"skipFiles": [ "skipFiles": [
"<node_internals>/**" "<node_internals>/**"
], ],
"program": "${workspaceFolder}/lib/index.js", "program": "${workspaceFolder}/lib/index.js",
"args": ["games.protospace.ca"] "args": ["games.protospace.ca"]
}, },
{ {
"type": "node", "type": "node",
"request": "launch", "request": "launch",
"name": "Launch Program", "name": "Launch Program",
"skipFiles": [ "skipFiles": [
"<node_internals>/**" "<node_internals>/**"
], ],
"program": "${workspaceFolder}/lib/index.js", "program": "${workspaceFolder}/lib/index.js",
// port may need to be changed for each session // port may need to be changed for each session
"args": ["localhost", "56901"] "args": ["localhost", "56901"]
} }
] ]
} }

View File

@@ -29,7 +29,7 @@ let plugins = {}
function loadplugin(pluginname, pluginpath) { function loadplugin(pluginname, pluginpath) {
try { try {
plugins[pluginname] = require(pluginpath) plugins[pluginname] = require(pluginpath)
plugins[pluginname]?.load(cfg) plugins[pluginname].load(cfg)
} catch (error) { } catch (error) {
if (error.code == 'MODULE_NOT_FOUND') { if (error.code == 'MODULE_NOT_FOUND') {
console.warn('plugin not used:', pluginpath) console.warn('plugin not used:', pluginpath)
@@ -44,7 +44,7 @@ function unloadplugin(pluginname, pluginpath) {
const plugin = require.resolve(pluginpath) const plugin = require.resolve(pluginpath)
try { try {
if (plugin && require.cache[plugin]) { if (plugin && require.cache[plugin]) {
require.cache[plugin].exports?.unload() require.cache[plugin].exports.unload()
delete plugins[pluginname] delete plugins[pluginname]
delete require.cache[plugin] delete require.cache[plugin]
} }
@@ -99,7 +99,7 @@ bot.once("spawn", () => {
inventory: require('./plugins/inventory'), inventory: require('./plugins/inventory'),
eater: require('./plugins/eater'), eater: require('./plugins/eater'),
finder: require('./plugins/finder'), finder: require('./plugins/finder'),
miner: require('./plugins/miner'), // miner: require('./plugins/miner.js'),
// statemachine: require('./plugins/statemachine'), // statemachine: require('./plugins/statemachine'),
} }

View File

@@ -1,113 +1,113 @@
let cfg = {} let cfg = {}
let bot = {} let bot = {}
let isEating = false let isEating = false
function callbackHandle(err) { function callbackHandle(err) {
if (err) console.error(err) if (err) console.error(err)
} }
function eat(callback) { function eat(callback) {
isEating = true isEating = true
const foodNames = require('minecraft-data')(bot.version).foodsArray.map((item) => item.name) const foodNames = require('minecraft-data')(bot.version).foodsArray.map((item) => item.name)
let available_food = bot.inventory let available_food = bot.inventory
.items() .items()
.filter((item) => foodNames.includes(item.name)) .filter((item) => foodNames.includes(item.name))
if (available_food.length === 0 || !available_food) { if (available_food.length === 0 || !available_food) {
isEating = false isEating = false
return callback(new Error('No food found.')) return callback(new Error('No food found.'))
} }
if (cfg.eat.bannedFood.length > 0) { if (cfg.eat.bannedFood.length > 0) {
available_food = available_food.filter( available_food = available_food.filter(
(item) => !cfg.eat.bannedFood.includes(item.name) (item) => !cfg.eat.bannedFood.includes(item.name)
) )
} }
let priority = cfg.eat.priority let priority = cfg.eat.priority
let best_food = available_food.reduce((prev, current) => (prev[priority] > current[priority]) ? prev : current) let best_food = available_food.reduce((prev, current) => (prev[priority] > current[priority]) ? prev : current)
if (!best_food) { if (!best_food) {
isEating = false isEating = false
return callback(new Error('No best food has been found.')) return callback(new Error('No best food has been found.'))
} }
bot.emit('eat_start') bot.emit('eat_start')
bot.equip(best_food, 'hand', function (error) { bot.equip(best_food, 'hand', function (error) {
if (error) { if (error) {
console.error(error) console.error(error)
isEating = false isEating = false
bot.emit('eat_stop') bot.emit('eat_stop')
} else { } else {
bot.consume(function (err) { bot.consume(function (err) {
if (err) { if (err) {
console.error(err) console.error(err)
isEating = false isEating = false
bot.emit('eat_stop') bot.emit('eat_stop')
return callback(err) return callback(err)
} else { } else {
isEating = false isEating = false
bot.emit('eat_stop') bot.emit('eat_stop')
callback(null) callback(null)
if (!bot.food === 20) eat(callbackHandle) if (!bot.food === 20) eat(callbackHandle)
} }
}) })
} }
}) })
} }
function checkFood() { function checkFood() {
console.info("eater: " console.info("eater: "
// , " status: ", !isEating // , " status: ", !isEating
, cfg.eat.auto && "auto" , cfg.eat.auto && "auto"
, bot.food < cfg.eat.startAt && "hungry" , bot.food < cfg.eat.startAt && "hungry"
, "hunger:", bot.food , "hunger:", bot.food
, "at:", cfg.eat.startAt) , "at:", cfg.eat.startAt)
if ( if (
!isEating !isEating
&& cfg.eat.auto && cfg.eat.auto
&& bot.food < cfg.eat.startAt && bot.food < cfg.eat.startAt
) { ) {
if ( if (
(bot.pathfinder (bot.pathfinder
&& !(bot.pathfinder.isMining() || bot.pathfinder.isBuilding()) && !(bot.pathfinder.isMining() || bot.pathfinder.isBuilding())
// TODO implement better idle state // TODO implement better idle state
) || true // idle most likely ) || true // idle most likely
) { ) {
eat(callbackHandle) eat(callbackHandle)
} }
} }
} }
function resetEat(value) { function resetEat(value) {
// to prevent the plugin from breaking if the bot gets killed while eating btw // to prevent the plugin from breaking if the bot gets killed while eating btw
isEating = !!value // false isEating = !!value // false
} }
const load = (config) => { const load = (config) => {
cfg = config cfg = config
bot = cfg.bot bot = cfg.bot
cfg.eat = { cfg.eat = {
priority: 'saturation', //'foodPoints', // priority: 'saturation', //'foodPoints', //
// startAt: 19, //anarchy // startAt: 19, //anarchy
// startAt: 18, // startAt: 18,
startAt: 14, startAt: 14,
bannedFood: [ bannedFood: [
"enchanted_golden_apple", "golden_apple", "pufferfish", "chorus_fruit" "enchanted_golden_apple", "golden_apple", "pufferfish", "chorus_fruit"
], ],
auto: true auto: true
} }
bot.on('health', checkFood) bot.on('health', checkFood)
bot.on('spawn', resetEat) bot.on('spawn', resetEat)
} }
const unload = () => { const unload = () => {
bot.off('health', checkFood) bot.off('health', checkFood)
bot.off('spawn', resetEat) bot.off('spawn', resetEat)
} }
module.exports = { load, unload, eat, resetEat } module.exports = { load, unload, eat, resetEat }

View File

@@ -1,95 +1,95 @@
// import { EntityFilters } from "mineflayer-statemachine" // import { EntityFilters } from "mineflayer-statemachine"
// import v from "vec3" // import v from "vec3"
// import { Movements } from "mineflayer-pathfinder" // import { Movements } from "mineflayer-pathfinder"
// const mineflayer = require('mineflayer') // const mineflayer = require('mineflayer')
const { Movements } = require('mineflayer-pathfinder') const { Movements } = require('mineflayer-pathfinder')
// const { GoalBLah } = require('mineflayer-pathfinder').goals // const { GoalBLah } = require('mineflayer-pathfinder').goals
const v = require('vec3') const v = require('vec3')
let cfg = {} let cfg = {}
let bot = {} let bot = {}
// let moving // let moving
let pathfinder let pathfinder
let movements = [] let movements = []
function initMoves(bot = bot, mcData = require('minecraft-data')(bot.version)) { function initMoves(bot = bot, mcData = require('minecraft-data')(bot.version)) {
let defaultMove = new Movements(bot, mcData) let defaultMove = new Movements(bot, mcData)
defaultMove.canDig = false defaultMove.canDig = false
defaultMove.scafoldingBlocks.push(mcData.blocksByName.slime_block.id) defaultMove.scafoldingBlocks.push(mcData.blocksByName.slime_block.id)
// defaultMove.blocksCantBreak.add(mcData.blocksByName.glass.id) // defaultMove.blocksCantBreak.add(mcData.blocksByName.glass.id)
// defaultMove.blocksToAvoid.add(mcData.blocksByName.magma.id) // defaultMove.blocksToAvoid.add(mcData.blocksByName.magma.id)
movements.defaultMove = defaultMove movements.defaultMove = defaultMove
bot.pathfinder.setMovements(defaultMove) bot.pathfinder.setMovements(defaultMove)
} }
function moveNear(pos, distance = 3) { function moveNear(pos, distance = 3) {
const { GoalNear } = require('mineflayer-pathfinder').goals const { GoalNear } = require('mineflayer-pathfinder').goals
cfg.quiet || bot.chat(`moving to ${pos}`) cfg.quiet || bot.chat(`moving to ${pos}`)
pos = v(pos) pos = v(pos)
bot.pathfinder.setMovements(movements.defaultMove) bot.pathfinder.setMovements(movements.defaultMove)
bot.pathfinder.setGoal(new GoalNear(pos.x, pos.y, pos.z, distance)) bot.pathfinder.setGoal(new GoalNear(pos.x, pos.y, pos.z, distance))
} }
function follow(entity, dynamic = true) { function follow(entity, dynamic = true) {
console.assert(entity) console.assert(entity)
const { GoalFollow } = require('mineflayer-pathfinder').goals const { GoalFollow } = require('mineflayer-pathfinder').goals
cfg.quiet && console.log(entity) cfg.quiet && console.log(entity)
|| bot.chat( || bot.chat(
`following ${entity.type `following ${entity.type
}: ${entity.username || entity.displayName }: ${entity.username || entity.displayName
}${dynamic ? "" : " once"}` }${dynamic ? "" : " once"}`
) )
entity = entity.entity ? entity.entity : entity entity = entity.entity ? entity.entity : entity
// console.log(entity) // console.log(entity)
bot.pathfinder.setMovements(movements.defaultMove) bot.pathfinder.setMovements(movements.defaultMove)
bot.pathfinder.setGoal(new GoalFollow(entity, 3), dynamic) bot.pathfinder.setGoal(new GoalFollow(entity, 3), dynamic)
} }
function hit(blockOrEntity) { function hit(blockOrEntity) {
bot.chat(`hitting ${entity.name || entity.type}`) bot.chat(`hitting ${entity.name || entity.type}`)
} }
function stop() { function stop() {
bot.pathfinder.setGoal(null) bot.pathfinder.setGoal(null)
bot.stopDigging() bot.stopDigging()
} }
const load = (config) => { const load = (config) => {
cfg = config cfg = config
bot = cfg.bot bot = cfg.bot
cfg.move = { cfg.move = {
// auto: true, // auto: true,
canDig: false, canDig: false,
// list: ["hello", "wassup"], // list: ["hello", "wassup"],
quiet: !!cfg.quiet, quiet: !!cfg.quiet,
movements: [] movements: []
} }
pathfinder = bot.pathfinder || bot.loadPlugin(require('mineflayer-pathfinder').pathfinder) pathfinder = bot.pathfinder || bot.loadPlugin(require('mineflayer-pathfinder').pathfinder)
// initMoves(bot, mcData) // initMoves(bot, mcData)
setTimeout(initMoves, 500, bot) setTimeout(initMoves, 500, bot)
// bot.loadPlugin(pathfinder) // bot.loadPlugin(pathfinder)
// bot.on('time', hello) // bot.on('time', hello)
} }
const unload = () => { const unload = () => {
// TODO stop pathfinding maybe? // TODO stop pathfinding maybe?
} }
module.exports = { load, unload, stop, initMoves, moveNear, follow } module.exports = { load, unload, stop, initMoves, moveNear, follow }

View File

@@ -1,13 +1,6 @@
let pathfinder let pathfinder
//TODO replace with simple pathfinder motions //TODO replace with simple pathfinder motions
const {
gameplay,
MoveTo,
MoveToInteract,
ObtainItem,
// Craft
} = require('prismarine-gameplay')
let cfg = {} let cfg = {}
let bot = {} let bot = {}
@@ -33,42 +26,33 @@ function sleep(quiet) {
} }
if (bed && bedstatus == "") { if (bed && bedstatus == "") {
bot.lookAt(bed.position) bot.lookAt(bed.position)
// const nearbed = bot.waitForChunksToLoad(() => {
bot.gameplay.solveFor( cfg.plugins.moveNear(bed.position)
new MoveTo((bed.position.range = 2) && bed.position), (err) => { bot.sleep(bed, (err) => {
// new MoveTo(bed.position), (err) => {
// new MoveToInteract(bed.position), (err) => {
if (err) { if (err) {
!quiet && bot.chat(`can't reach bed: ${err.message}`) !quiet && bot.chat(`can't sleep: ${err.message}`)
} else { } else {
bot.waitForChunksToLoad(() => { !quiet && bot.chat("zzz")
bot.sleep(bed, (err) => { console.log("sleeping? ", bot.isSleeping)
if (err) { // hack until this is fixed
!quiet && bot.chat(`can't sleep: ${err.message}`) // bot.isSleeping = bot.isSleeping ? bot.isSleeping : true
} else { bot.isSleeping = true
!quiet && bot.chat("zzz")
console.log("sleeping? ", bot.isSleeping)
// hack until this is fixed
// bot.isSleeping = bot.isSleeping ? bot.isSleeping : true
bot.isSleeping = true
}
})
})
} }
}) })
// } else if (bed){ })
} else if (inv && inv.equipItem("red_bed", "hand", true)) { } else if (inv && inv.equipItem("red_bed", "hand", true)) {
// doesn't work fortunately // doesn't work fortunately
// FIXME: DONT IMPLEMENT until it is detected as NOT NETHER // FIXME: DONT IMPLEMENT until it is detected as NOT NETHER
bot.placeBlock() // bot.placeBlock()
} else { } else {
bot.gameplay.solveFor( // TODO: use mover
new ObtainItem("bed"), (err) => { // bot.gameplay.solveFor(
if (err) { // new ObtainItem("bed"), (err) => {
!quiet && bot.chat(`need a${bedstatus} bed: may not see if just placed`) // if (err) {
} // !quiet && bot.chat(`need a${bedstatus} bed: may not see if just placed`)
} // }
) // }
// )
// bot.chat('/afk') // bot.chat('/afk')
} }
bot.pathfinder.movements bot.pathfinder.movements
@@ -104,7 +88,6 @@ const load = (config) => {
pathfinder = bot.pathfinder || require('mineflayer-pathfinder').pathfinder pathfinder = bot.pathfinder || require('mineflayer-pathfinder').pathfinder
// bot.loadPlugin(pathfinder) // bot.loadPlugin(pathfinder)
bot.loadPlugin(gameplay)
inv = cfg.plugins["inventory"] inv = cfg.plugins["inventory"]
bot.on("time", autoSleep) bot.on("time", autoSleep)

View File

@@ -42,7 +42,6 @@
"prismarine-block": "^1", "prismarine-block": "^1",
"prismarine-chat": "^1", "prismarine-chat": "^1",
"prismarine-entity": "^1.1.0", "prismarine-entity": "^1.1.0",
"prismarine-gameplay": "github:TheDudeFromCI/prismarine-gameplay#crafting",
"prismarine-item": "^1.5.0", "prismarine-item": "^1.5.0",
"prismarine-nbt": "^1.3", "prismarine-nbt": "^1.3",
"prismarine-recipe": "^1", "prismarine-recipe": "^1",