Files
2025-05-04 19:22:31 -04:00

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;