myncraftjs
Version:
Simple minecraft bot package extends from mineflayer
117 lines (116 loc) • 3.65 kB
JavaScript
import EventEmitter from "events";
import { createBot } from "mineflayer";
import { Logger } from "@myncraftjs/logger";
import colorChat from "@myncraftjs/colorchat";
import spawncommands from "@myncraftjs/spawncommands";
import defaultEventsSetup from "../utils/defaultEventsSetup";
export class Client extends EventEmitter {
_client;
bot;
logger;
options;
plugins = [];
_persistentListeners = [];
constructor(opt) {
super();
opt.hideErrors ??= true;
opt.logEvent ??= true;
this.options = opt;
this.bot = createBot(opt);
this._client = this.bot._client;
this.loadPlugins([colorChat, spawncommands]);
this.logger = new Logger({ header: opt.username || "Bot" });
if (!(opt.logger) && typeof opt.logger === "boolean") {
this.logger.error = () => { };
this.logger.log = () => { };
this.logger.warn = () => { };
}
if (opt.logEvent) {
const error = this.logger.error;
const log = this.logger.log;
const warn = this.logger.warn;
this.logger.error = (...texts) => {
this.emit("logger:error", texts);
error(texts);
};
this.logger.log = (...texts) => {
this.emit("logger:log", texts);
log(texts);
};
this.logger.error = (...texts) => {
this.emit("logger:error", texts);
warn(texts);
};
}
console.clear();
defaultEventsSetup(this);
this.bot.on("resourcePack", () => {
this.bot.acceptResourcePack();
});
}
restart() {
this.bot.end();
this._client.end();
this.bot = createBot(this.options);
this._client = this.bot._client;
this.loadPlugins(this.plugins);
console.clear();
this.bot.on("resourcePack", () => {
this.bot.acceptResourcePack();
});
this._bindPersistentListeners();
}
getBot() {
return this.bot;
}
_bindPersistentListeners() {
for (const { type, event, listener } of this._persistentListeners) {
if (type === "on") {
this.bot.on(event, listener);
}
else {
this.bot.once(event, listener);
}
}
}
on(event, listener) {
this._persistentListeners.push({ type: "on", event, listener });
super.on(event, listener);
this.bot.on(event, listener);
return this;
}
once(event, listener) {
this._persistentListeners.push({ type: "once", event, listener });
super.once(event, listener);
this.bot.once(event, listener);
return this;
}
loadPlugin(plugin) {
if (!this.plugins.includes(plugin))
this.plugins.push(plugin);
this.bot.loadPlugin(plugin);
}
loadPlugins(plugins) {
plugins.forEach(plugin => this.bot.loadPlugin(plugin));
}
chat(message) {
if (message.startsWith('/')) {
this.bot.chat(message);
}
else {
if (message.includes("\n"))
message.split("\n").forEach(m => {
console.log("Chat message:", m);
this.bot.chat(m);
});
else
this.bot.chat(message);
}
}
lookAt(username) {
const player = this.bot.players[username];
if (player && player.entity) {
this.bot.lookAt(player.entity.position);
}
}
}