cletus/bot/bot.js
roberts 4aacdd45ce
All checks were successful
Deploy Cletus Bot / deploy (push) Successful in 13s
version changes
2025-05-10 12:52:48 -05:00

88 lines
No EOL
2.5 KiB
JavaScript

const mineflayer = require('mineflayer');
const pathfinder = require('mineflayer-pathfinder').pathfinder;
const fs = require('fs');
const path = require('path');
const { getSafeZones, isInSafeZone } = require('./memory/locations');
const db = require('./db');
// configuration file.
const config = require('./config.json');
const { StateMachine } = require('./core/state-machine');
const context = require('./core/context');
// === Bot Config ===
const bot = mineflayer.createBot({
host: config.bot.host,
port: config.bot.port,
username: config.bot.name,
auth: config.bot.auth
});
bot.loadPlugin(pathfinder);
context.setBot(bot);
context.setDB(db);
let allowDestruction = false;
context.setAllowDestruction = (value) => { allowDestruction = value; };
context.getAllowDestruction = () => allowDestruction;
const originalDig = bot.dig;
bot.dig = async function (block, ...args) {
return new Promise((resolve, reject) => {
getSafeZones(db, async (err, zones) => {
if (err) {
console.warn('[SAFEZONE] Error loading zones:', err);
return reject(err);
}
// Check override first
if (context.getAllowDestruction() === true) {
try {
const result = await originalDig.call(bot, block, ...args);
console.log(`[DIG-OVERRIDE] ${block.name} at ${block.position}`);
return resolve(result);
} catch (digErr) {
return reject(digErr);
}
}
// Block dig inside safe zone
if (isInSafeZone(block.position, zones)) {
bot.chat("You're not allowed to dig here — it's a protected zone.");
console.log(`[BLOCKED] Attempted to dig inside safe zone: ${block.name} at ${block.position}`);
return resolve(false);
}
// Normal dig
try {
const result = await originalDig.call(bot, block, ...args);
console.log(`[DIG] ${block.name} at ${block.position} (allowed)`);
return resolve(result);
} catch (digErr) {
return reject(digErr);
}
});
});
};
bot.once('spawn', async () => {
console.log(`${config.bot.name} has spawned.`);
const stateMachine = new StateMachine(path.join(__dirname, 'states'));
context.setStateMachine(stateMachine);
await stateMachine.run('Observe');
});
bot.on('chat', (username, message) => {
if (username !== bot.username) {
context.setLastChat({ username, message });
context.getStateMachine().transition('HandleChat');
}
});
bot.on('death', () => {
context.getStateMachine().transition('ActOnMemory');
});