mirror of
https://github.com/kolbytn/mindcraft.git
synced 2025-07-31 20:35:31 +02:00
improved placeblock and attackmob
This commit is contained in:
parent
f216aea1cb
commit
0845ca1030
4 changed files with 75 additions and 27 deletions
|
@ -5,6 +5,7 @@
|
||||||
"mineflayer": "^4.14.0",
|
"mineflayer": "^4.14.0",
|
||||||
"mineflayer-collectblock": "^1.4.1",
|
"mineflayer-collectblock": "^1.4.1",
|
||||||
"mineflayer-pathfinder": "^2.4.4",
|
"mineflayer-pathfinder": "^2.4.4",
|
||||||
|
"mineflayer-pvp": "^1.3.2",
|
||||||
"openai": "^4.4.0"
|
"openai": "^4.4.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import minecraftData from 'minecraft-data';
|
import minecraftData from 'minecraft-data';
|
||||||
import { createBot } from 'mineflayer';
|
import { createBot } from 'mineflayer';
|
||||||
import { pathfinder } from 'mineflayer-pathfinder';
|
import { pathfinder } from 'mineflayer-pathfinder';
|
||||||
|
import pvp from 'mineflayer-pvp';
|
||||||
import { plugin } from 'mineflayer-collectblock';
|
import { plugin } from 'mineflayer-collectblock';
|
||||||
|
|
||||||
const mc_version = '1.19.3'
|
const mc_version = '1.19.3'
|
||||||
|
@ -15,6 +16,7 @@ export function initBot(username) {
|
||||||
version: mc_version,
|
version: mc_version,
|
||||||
});
|
});
|
||||||
bot.loadPlugin(pathfinder)
|
bot.loadPlugin(pathfinder)
|
||||||
|
bot.loadPlugin(pvp.plugin)
|
||||||
bot.loadPlugin(plugin)
|
bot.loadPlugin(plugin)
|
||||||
return bot;
|
return bot;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,22 +42,45 @@ export async function craftItem(bot, itemName, num=1) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export async function attackMob(bot, mobType) {
|
export async function attackMob(bot, mobType, kill=true) {
|
||||||
/**
|
/**
|
||||||
* Attack mob of the given type.
|
* Attack mob of the given type.
|
||||||
* @param {MinecraftBot} bot, reference to the minecraft bot.
|
* @param {MinecraftBot} bot, reference to the minecraft bot.
|
||||||
* @param {string} mobType, the type of mob to attack.
|
* @param {string} mobType, the type of mob to attack.
|
||||||
|
* @param {boolean} kill, whether or not to continue attacking until the mob is dead. Defaults to true.
|
||||||
* @returns {Promise<boolean>} true if the mob was attacked, false if the mob type was not found.
|
* @returns {Promise<boolean>} true if the mob was attacked, false if the mob type was not found.
|
||||||
* @example
|
* @example
|
||||||
* await skills.attackMob(bot, "zombie");
|
* await skills.attackMob(bot, "zombie", true);
|
||||||
**/
|
**/
|
||||||
const mobs = getNearbyMobs(bot);
|
const mob = bot.nearestEntity(entity => entity.name.toLowerCase() === mobType.toLowerCase());
|
||||||
for (let i = 0; i < mobs.length; i++) {
|
const attackable = ['animal', 'monster', 'mob'];
|
||||||
if (mobs[i].mobType == mobType) {
|
if (mob && attackable.includes(mob.type)) {
|
||||||
bot.attack(mobs[i]);
|
let pos = mob.position;
|
||||||
|
console.log(bot.entity.position.distanceTo(pos))
|
||||||
|
|
||||||
|
if (!kill) {
|
||||||
|
if (bot.entity.position.distanceTo(pos) > 5) {
|
||||||
|
console.log('moving to mob...')
|
||||||
|
bot.pathfinder.setMovements(new pf.Movements(bot));
|
||||||
|
await bot.pathfinder.goto(new pf.goals.GoalNear(pos.x, pos.y, pos.z, 5));
|
||||||
|
}
|
||||||
|
console.log('attacking mob...')
|
||||||
|
await bot.attack(mob);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bot.pvp.attack(mob);
|
||||||
|
while (getNearbyMobs(bot, 16).includes(mob)) {
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||||
|
if (bot.interrupt_code) {
|
||||||
|
bot.pvp.stop();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
log(bot, 'Could not find any '+mobType+' to attack.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,13 +94,12 @@ export async function collectBlock(bot, blockType) {
|
||||||
* @example
|
* @example
|
||||||
* await skills.collectBlock(bot, "oak_log");
|
* await skills.collectBlock(bot, "oak_log");
|
||||||
**/
|
**/
|
||||||
const blocks = getNearbyBlocks(bot);
|
const block = getNearestBlock(bot, blockType);
|
||||||
for (let i = 0; i < blocks.length; i++) {
|
if (block) {
|
||||||
if (blocks[i].name == blockType) {
|
await bot.collectBlock.collect(block);
|
||||||
await bot.collectBlock.collect(blocks[i]);
|
return true;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
log(bot, `Could not find ${blockType} to collect.`);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,15 +159,6 @@ export async function placeBlock(bot, blockType, x, y, z) {
|
||||||
log(bot, `Cannot place block at ${targetBlock.position} because there is nothing to build off of.`);
|
log(bot, `Cannot place block at ${targetBlock.position} because there is nothing to build off of.`);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
console.log("buildOffBlock: ", buildOffBlock.position, buildOffBlock.name, "faceVec: ", faceVec)
|
|
||||||
|
|
||||||
// check if bot is in the way
|
|
||||||
console.log("bot position: ", bot.entity.position, "buildOffBlock.position: ", buildOffBlock.position.plus(faceVec), "distance: ", bot.entity.position.distanceTo(buildOffBlock.position.plus(faceVec)))
|
|
||||||
if (bot.entity.position.distanceTo(buildOffBlock.position.plus(faceVec)) < 0.5) {
|
|
||||||
log(bot, `Cannot place block at ${buildOffBlock.position} because you are in the way.`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("Placing on: ", buildOffBlock.position, buildOffBlock.name)
|
console.log("Placing on: ", buildOffBlock.position, buildOffBlock.name)
|
||||||
|
|
||||||
let block = bot.inventory.items().find(item => item.name === blockType);
|
let block = bot.inventory.items().find(item => item.name === blockType);
|
||||||
|
@ -155,6 +168,40 @@ export async function placeBlock(bot, blockType, x, y, z) {
|
||||||
}
|
}
|
||||||
await bot.equip(block, 'hand');
|
await bot.equip(block, 'hand');
|
||||||
|
|
||||||
|
|
||||||
|
// too close
|
||||||
|
let blockAbove = bot.blockAt(targetBlock.position.plus(Vec3(0,1,0)))
|
||||||
|
if (bot.entity.position.distanceTo(targetBlock.position) < 1 || bot.entity.position.distanceTo(blockAbove.position) < 1) {
|
||||||
|
console.log('moving away from block...')
|
||||||
|
let found = false;
|
||||||
|
for(let i = 0; i < 10; i++) {
|
||||||
|
console.log('looking for block...')
|
||||||
|
const randomDirection = new Vec3((Math.random() > 0.5 ? 1 : -1), 0, (Math.random() > 0.5 ? 1 : -1));
|
||||||
|
const pos = targetBlock.position.add(randomDirection.scale(1.2));
|
||||||
|
if (bot.blockAt(pos).name === 'air') {
|
||||||
|
console.log('found good position')
|
||||||
|
bot.pathfinder.setMovements(new pf.Movements(bot));
|
||||||
|
await bot.pathfinder.goto(new pf.goals.GoalNear(pos.x, pos.y, pos.z, 1.2));
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
console.log('could not find good position')
|
||||||
|
log(bot, `Was too close to place ${blockType} at ${targetBlock.position}.`)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// too far
|
||||||
|
if (bot.entity.position.distanceTo(targetBlock.position) > 4.5) {
|
||||||
|
// move close until it is within 6 blocks
|
||||||
|
console.log('moving closer to block...')
|
||||||
|
let pos = targetBlock.position;
|
||||||
|
bot.pathfinder.setMovements(new pf.Movements(bot));
|
||||||
|
await bot.pathfinder.goto(new pf.goals.GoalNear(pos.x, pos.y, pos.z, 4));
|
||||||
|
}
|
||||||
|
// too close
|
||||||
|
|
||||||
// turn to face the block
|
// turn to face the block
|
||||||
await bot.lookAt(buildOffBlock.position.plus(faceVec));
|
await bot.lookAt(buildOffBlock.position.plus(faceVec));
|
||||||
|
|
||||||
|
@ -163,7 +210,7 @@ export async function placeBlock(bot, blockType, x, y, z) {
|
||||||
console.log("placing block...")
|
console.log("placing block...")
|
||||||
|
|
||||||
// wait and then check if the block was placed
|
// wait and then check if the block was placed
|
||||||
await new Promise(resolve => setTimeout(resolve, 500));
|
await new Promise(resolve => setTimeout(resolve, 200));
|
||||||
const newBlock = bot.blockAt(buildOffBlock.position.plus(faceVec));
|
const newBlock = bot.blockAt(buildOffBlock.position.plus(faceVec));
|
||||||
if (!newBlock) return false;
|
if (!newBlock) return false;
|
||||||
if (newBlock.name !== blockType) {
|
if (newBlock.name !== blockType) {
|
||||||
|
|
|
@ -49,9 +49,7 @@ export function getNearbyMobs(bot, maxDistance) {
|
||||||
for (const entity of Object.values(bot.entities)) {
|
for (const entity of Object.values(bot.entities)) {
|
||||||
const distance = entity.position.distanceTo(bot.entity.position);
|
const distance = entity.position.distanceTo(bot.entity.position);
|
||||||
if (distance > maxDistance) continue;
|
if (distance > maxDistance) continue;
|
||||||
if (entity.type == 'mob') {
|
entities.push({ entity: entity, distance: distance });
|
||||||
entities.push({ entity: entity, distance: distance });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
entities.sort((a, b) => a.distance - b.distance);
|
entities.sort((a, b) => a.distance - b.distance);
|
||||||
let res = [];
|
let res = [];
|
||||||
|
@ -138,8 +136,8 @@ export function getNearbyMobTypes(bot) {
|
||||||
let mobs = getNearbyMobs(bot, 16);
|
let mobs = getNearbyMobs(bot, 16);
|
||||||
let found = [];
|
let found = [];
|
||||||
for (let i = 0; i < mobs.length; i++) {
|
for (let i = 0; i < mobs.length; i++) {
|
||||||
if (!found.includes(mobs[i].mobType)) {
|
if (!found.includes(mobs[i].name)) {
|
||||||
found.push(mobs[i].mobType);
|
found.push(mobs[i].name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return found;
|
return found;
|
||||||
|
|
Loading…
Add table
Reference in a new issue