const clamp = require('../util/clamp') function inject (bot, dcclient, config) { const bossbarName = 'chomens_bot:tps' let enabled = false bot.tps = { on () { enabled = true }, off () { enabled = false bot.core.run(`minecraft:bossbar remove ${bossbarName}`) } } const tickRates = [] let nextIndex = 0 let timeLastTimeUpdate = -1 let timeGameJoined const interval = setInterval(() => { if (!enabled) return const component = { translate: 'TPS - %s', color: 'gray', bold: false, with: [ { text: getTickRate(), color: 'green' } ] } bot.core.run(`minecraft:bossbar add ${bossbarName} ""`) bot.core.run(`minecraft:bossbar set ${bossbarName} players @a`) bot.core.run(`minecraft:bossbar set ${bossbarName} color yellow`) bot.core.run(`minecraft:bossbar set ${bossbarName} visible true`) bot.core.run(`minecraft:bossbar set ${bossbarName} style progress`) bot.core.run(`minecraft:bossbar set ${bossbarName} name ${JSON.stringify(component)}`) bot.core.run(`minecraft:bossbar set ${bossbarName} max 20`) bot.core.run(`minecraft:bossbar set ${bossbarName} value ${Math.floor(getTickRate())}`) }, 50) function getTickRate () { if (Date.now() - timeGameJoined < 4000) return 'Calculating...' let numTicks = 0 let sumTickRates = 0.0 for (const tickRate of tickRates) { if (tickRate > 0) { sumTickRates += tickRate numTicks++ } } const value = (sumTickRates / numTicks).toFixed(2) if (value > 20) return 20 else return value } bot.on('login', () => { nextIndex = 0 timeGameJoined = timeLastTimeUpdate = Date.now() }) bot._client.on('update_time', () => { const now = Date.now() const timeElapsed = (now - timeLastTimeUpdate) / 1000.0 tickRates[nextIndex] = clamp(20.0 / timeElapsed, 0.0, 20.0) nextIndex = (nextIndex + 1) % tickRates.length timeLastTimeUpdate = now }) bot.on('end', () => clearInterval(interval)) } module.exports = { inject }