diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.ts | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..c6bf915 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,133 @@ +import 'dotenv/config'; +import mineflayer from 'mineflayer'; +import { ChannelType, Client, GatewayIntentBits } from "discord.js"; +const mineflayerViewer = require('prismarine-viewer').mineflayer +import { pathfinder, Movements, goals } from 'mineflayer-pathfinder'; +import { plugin as autoeat } from 'mineflayer-auto-eat'; + +const hostname: string = "localhost" + +const discordClient = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages] }); +const discordChannelId: string = process.env.DISCORD_CHANNEL as string +const discordToken: string = process.env.DISCORD_TOKEN as string +const goal: goals.Goal = new goals.GoalNear(0, 60, -2000000, 1) +const updateTimeMinutes: number = 30 +const minHealth: number = 15 +const swingArmTimeSeconds: number = 3 + +//TODO antiafk mineflayer plugin NEED autoeeat +//maybe not need to merge, check if end. to diconnect from proxy make a command or somethin +//todo maybe fix fall damage antihunger + +function sendMessageToChannel(message: string) { + const channel = discordClient?.channels.cache.get(discordChannelId) + if (channel?.type !== ChannelType.GuildText) return + + console.log(message) + channel?.send(message) +} + +function quit(reason: any) { + sendMessageToChannel(`${bot.username} disconnected from ${hostname}, reason: ${reason}\n\tCoords: ${bot.entity?.position}\n\tDim: ${bot.game.dimension}\n\tHP: ${bot.health}`) + bot.quit() +} + +discordClient.login(discordToken); + +discordClient.once("ready", () => { + console.log(`discord: Logged in as ${discordClient?.user?.tag}!`); +}); + +const bot = mineflayer.createBot({ + host: hostname, + port: 25565, + username: process.env.MINECRAFT_EMAIL as string, + version: "1.12.2", + auth: 'microsoft' +}) + +bot.loadPlugin(pathfinder) +bot.loadPlugin(autoeat) + +bot.once('spawn', () => { + mineflayerViewer(bot, { firstPerson: true, port: 3000 }); + const defaultMove = new Movements(bot); + + (bot as any).autoEat.options.priority = 'saturation'; + (bot as any).autoEat.options.startAt = 16; + + (bot as any).pathfinder.setMovements(defaultMove); + (bot as any).pathfinder.setGoal(goal); + + setTimeout(() => { + sendMessageToChannel(`Joined ${hostname} with ${bot.username}\n\tCoords: ${bot.entity?.position}\n\tDim: ${bot.game.dimension}\n\tHP: ${bot.health}`) + }, 2000); +}) + +bot.on('entityMoved', (entity: any) => { + if (entity.player === null || entity.username === undefined) return + if (entity.username === bot.username) return + if (eval(process.env.MINECRAFT_ALTS as string).includes(entity.username)) return + + quit(`player (${entity.username}) moved nearby`) +}) + +bot.on('health', () => { + if (bot.health < minHealth) + quit(`low hp: ${bot.health}`) +}) + + +var originalFunction = bot._client.write; + +// Create a new function that wraps the original function +var newFunction = function (this: unknown, name: string, params: any) { + //console.log(`WRITE called with ${ name }: ${ params } `); + //console.log("a: " + Object.keys(name)) + //console.log("b: " + Object.keys(params)) + if (name === "entity_action") { + if (params.actionId === 3 || params.actionId === 4) { + //console.log("CANCELLING ACTION ID: " + params.actionId) + return; + } + } + //if (a === "chat") { + //console.log("CANCELLED CHAT" + b.message) + // return; + //} + if (name === 'position_look' || name === 'position') { + //console.log("PACKET: " + name + " CANCELLING ON GROUND: " + params.onGround) + params.onGround = false + //console.log("CANCELLED ON GROUND: " + params.onGround) + } + return originalFunction.apply(this, [...arguments] as [name: string, params: any]) +} + +// Replace the original function with the new function +bot._client.write = newFunction; + +setInterval(() => { + if (bot._client.state !== "play") return + + sendMessageToChannel(`Currently on ${hostname} with ${bot.username}\n\tCoords: ${bot.entity?.position}\n\tDim: ${bot.game.dimension}\n\tHP: ${bot.health}`) +}, updateTimeMinutes * 60 * 1000); + +setInterval(() => { + if (bot._client.state !== "play") return + bot.swingArm(undefined) + //bot.chat("Saturation: " + bot.foodSaturation + " Food: " + bot.food) +}, swingArmTimeSeconds * 1000); + +bot.on('death', () => { + setTimeout(() => { + quit("died") + }, 3000); +}) + +bot.on('kicked', (message: any) => { + sendMessageToChannel(`Got kicked (message: ${message}) from on ${hostname} with ${bot.username}\n\tCoords: ${bot.entity?.position}\n\tDim: ${bot.game.dimension}\n\tHP: ${bot.health}`) +}) + +bot.on('error', (message: any) => { + sendMessageToChannel(`Got an error (error: ${message}) from on ${hostname} with ${bot.username}\n\tCoords: ${bot.entity?.position}\n\tDim: ${bot.game.dimension}\n\tHP: ${bot.health}`) +}) \ No newline at end of file |