166 lines
4.2 KiB
JavaScript
166 lines
4.2 KiB
JavaScript
'use strict';
|
|
|
|
const conf = require('../conf');
|
|
const {sleep} = require('../utils');
|
|
|
|
|
|
async function throwSnowballAtEntity(bot, entity) {
|
|
const snowballItem = bot.bot.inventory.items().find(item => item.name === 'snowball');
|
|
|
|
if (!snowballItem) {
|
|
console.log("No snowballs in inventory.");
|
|
return;
|
|
}
|
|
|
|
// Equip the snowball
|
|
try{
|
|
await bot.bot.equip(snowballItem, 'hand')
|
|
|
|
let tossAt = bot.findBlockBySign('bot balls');
|
|
// Simulate throwing a snowball
|
|
/* const nearestHayBlock = bot.bot.findBlock({
|
|
useExtraInfo: true,
|
|
maxDistance: 64,
|
|
matching: (block)=>block.name.includes('hay'),
|
|
});
|
|
if (nearestHayBlock){
|
|
}*/
|
|
|
|
await bot.bot.lookAt(tossAt.position.offset(0, -2, 0));
|
|
await sleep(150);
|
|
bot.bot.activateItem(); // This would simulate the throw of the snowball
|
|
await sleep(200);
|
|
bot.bot.activateItem(); // This would simulate the throw of the snowball
|
|
await sleep(300);
|
|
bot.bot.activateItem(); // This would simulate the throw of the snowball
|
|
|
|
}catch(error){
|
|
console.log('GoldFarm.throwSnowballAtEntity error', error);
|
|
}
|
|
}
|
|
|
|
function getNearestEntityInDirection(bot, direction, entityType) {
|
|
const entities = Object.values(bot.entities).filter(entity =>
|
|
entity.position && entity !== bot.entity && entity.name === entityType
|
|
);
|
|
let nearestEntity = null;
|
|
let minDistance = Infinity;
|
|
|
|
for (const entity of entities) {
|
|
const relativePos = entity.position.minus(bot.entity.position);
|
|
const angle = Math.atan2(relativePos.x, relativePos.z);
|
|
const targetAngle = direction * (Math.PI / 180);
|
|
const angleDiff = Math.abs(angle - targetAngle);
|
|
|
|
if (angleDiff < Math.PI / 8) {
|
|
const distance = bot.entity.position.distanceTo(entity.position);
|
|
if (distance < minDistance) {
|
|
minDistance = distance;
|
|
nearestEntity = entity;
|
|
}
|
|
}
|
|
}
|
|
return nearestEntity;
|
|
}
|
|
|
|
class GoldFarm{
|
|
location = {};
|
|
|
|
constructor(args){
|
|
this.bot = args.bot;
|
|
this.target = args.target;
|
|
this.interval = args.interval;
|
|
this.intervalStop;
|
|
}
|
|
|
|
locationsSet(){
|
|
this.location.xpSpotAlone = this.bot.findBlockBySign('xpSpotAlone');
|
|
this.location.xpSpotSecond = this.bot.findBlockBySign('xpSpotSecond');
|
|
this.location.xp = this.location.xpSpotAlone;
|
|
this.location.attack = this.bot.findBlockBySign('bot attack spot');
|
|
}
|
|
|
|
async init(){
|
|
this.onReadyListen = this.bot.on('onReady', async ()=>{
|
|
await sleep(1000);
|
|
console.log('GoldFarm.init onReady called');
|
|
try{
|
|
this.locationsSet();
|
|
|
|
await this.agroPigs();
|
|
|
|
}catch(error){
|
|
console.error('Error in GoldFarm.init:', error);
|
|
}
|
|
|
|
|
|
await this.gotoXP();
|
|
|
|
// let count = 1;
|
|
// this.onPhysicTick = this.bot.on('physicsTick', async () => {
|
|
// if(this.bot.bot.pathfinder.isMoving()) return;
|
|
// if(count++ === 100){
|
|
// count = 1;
|
|
// for(let playerName in this.bot.bot.players){
|
|
// if(this.bot.playerWithinBlock(playerName, this.location.xpSpotAlone, 1.5)){
|
|
// this.location.xp = this.location.xpSpotSecond;
|
|
// }else{
|
|
// this.location.xp = this.location.xpSpotAlone;
|
|
// }
|
|
// await this.gotoXP();
|
|
// }
|
|
|
|
// }
|
|
// });
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
unload(){
|
|
console.log('GoldFarm.unload');
|
|
clearInterval(this.intervalStop);
|
|
this.intervalStop = null;
|
|
this.onReadyListen();
|
|
if(this.onPhysicTick) this.onPhysicTick();
|
|
|
|
return true;
|
|
}
|
|
|
|
async agroPigs(){
|
|
await this.bot.goTo({
|
|
where: this.location.attack,
|
|
range: 2,
|
|
});
|
|
|
|
await sleep(1000);
|
|
// let entity = this.bot.bot.nearestEntity(
|
|
// entity => entity.name.toLowerCase() === 'zombified_piglin' && this.bot.bot.entity.position.distanceTo(entity.position) >= 10
|
|
// );
|
|
|
|
let entity = getNearestEntityInDirection(this.bot.bot, 270, 'zombified_piglin');
|
|
|
|
console.log('entity', entity)
|
|
|
|
this.bot.bot.setControlState('jump', true);
|
|
await sleep(100);
|
|
await throwSnowballAtEntity(this.bot, entity);
|
|
|
|
await sleep(1200);
|
|
this.bot.bot.setControlState('jump', false);
|
|
}
|
|
|
|
async gotoXP(){
|
|
await this.bot.bot.equip(this.bot.bot.inventory.items().find(
|
|
item => item.name === 'diamond_sword'
|
|
), 'hand');
|
|
|
|
await this.bot.goTo({
|
|
where: this.location.xp,
|
|
range: 1,
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = GoldFarm;
|