aboutsummaryrefslogtreecommitdiff
path: root/render/guis
diff options
context:
space:
mode:
Diffstat (limited to 'render/guis')
-rw-r--r--render/guis/collectionGui.js52
-rw-r--r--render/guis/coordsGui.js86
-rw-r--r--render/guis/cwGui.js152
-rw-r--r--render/guis/downtimeGui.js85
-rw-r--r--render/guis/efficientMinerOverlayGui.js113
-rw-r--r--render/guis/powertrackerGui.js116
-rw-r--r--render/guis/timerGui.js43
7 files changed, 647 insertions, 0 deletions
diff --git a/render/guis/collectionGui.js b/render/guis/collectionGui.js
new file mode 100644
index 0000000..3764fcf
--- /dev/null
+++ b/render/guis/collectionGui.js
@@ -0,0 +1,52 @@
+import constants from "../../util/constants"
+import settings from "../../settings"
+import { trackerGui } from "../../util/helperFunctions"
+const PREFIX = constants.PREFIX
+const collectionGui = new trackerGui("", "Collection Not set! /cw track", settings.collectionNotation)
+
+
+export function trackCollection(arg)
+{
+ collectionGui.resetVars()
+ let collections = JSON.parse(FileLib.read("Coleweight", "data/collections.json"))
+ if(arg == "obby") arg = "obsidian"
+ if(arg == "cobble") arg = "cobblestone"
+ if(collections[arg.toLowerCase()] == undefined) return ChatLib.chat(`${PREFIX}&eThat is not a valid collection! (or is not supported)`)
+ collectionGui.trackedItem = collections[arg].collectionToTrack
+ collectionGui.itemStringed = collections[arg].collectionStringed
+
+ ChatLib.chat(`${PREFIX}&bSet collection to ${collectionGui.itemStringed}!`)
+}
+
+export function openCollectionGui()
+{
+ collectionGui.moveGui()
+}
+
+export function reloadCollection()
+{
+ collectionGui.resetVars()
+}
+
+register("dragged", (dx, dy, x, y) => {
+ if (!collectionGui.collectionMoveGui.isOpen()) return
+ constants.collectiondata.x = x
+ constants.collectiondata.y = y
+ constants.collectiondata.save()
+})
+
+register("renderOverlay", () => {
+ collectionGui.renderGui(constants.collectiondata.x, constants.collectiondata.y, settings.collectionTracker, settings.collectionNotation, settings.showCollectionTrackerAlways)
+})
+
+register("step", () => {
+ let date_ob = new Date(),
+ seconds = date_ob.getSeconds()
+
+ if(collectionGui.trackingItem == true)
+ collectionGui.uptimeSeconds += 1
+ if(seconds == 0 || seconds == 15 || seconds == 30 || seconds == 45)
+ {
+ collectionGui.calcApi(["members", Player.getUUID().replace(/-/g, ""), "collection"], Player.getUUID())
+ }
+}).setFps(1) \ No newline at end of file
diff --git a/render/guis/coordsGui.js b/render/guis/coordsGui.js
new file mode 100644
index 0000000..0c1f244
--- /dev/null
+++ b/render/guis/coordsGui.js
@@ -0,0 +1,86 @@
+import {
+ AdditiveConstraint,
+ CenterConstraint,
+ ConstantColorConstraint,
+ UIBlock,
+ UIImage,
+ UIWrappedText,
+ UIText,
+ WindowScreen,
+ } from "../../../Elementa"
+
+const Color = Java.type("java.awt.Color"),
+ URL = Java.type("java.net.URL"),
+ WIDTH = 3.5, // not actually width more like reverse of width lmao, bigger = smaller
+ HEIGHT = 2.877 // ^
+let ScreenW = Renderer.screen.getWidth(),
+ ScreenH = Renderer.screen.getHeight()
+
+function coordsWindow(row, column, title, command, desc, image=false, alternateText="")
+{
+ const coordWindow = new UIBlock(new Color(0, 0, 0, 0.5)) // 320 960
+ .setX(((ScreenW/3*(column))-ScreenW/3.25).pixels())
+ .setY((ScreenH/2*(row-1)+ScreenH/10.8).pixels())
+ .setWidth((ScreenW/WIDTH).pixels())
+ .setHeight((ScreenH/HEIGHT).pixels())
+ .onMouseClick(() => {
+ ChatLib.command(command, true)
+ })
+ new UIText(title, false)
+ .setX(new CenterConstraint())
+ .setY((2).pixels())
+ .setTextScale((2).pixels())
+ .setColor(new ConstantColorConstraint(Color.GREEN.darker()))
+ .setChildOf(coordWindow)
+ if(image == true)
+ {
+ new UIWrappedText(alternateText)
+ .setX((12).pixels())
+ .setY((25).pixels())
+ .setWidth((ScreenW/5).pixels())
+ .setTextScale((1).pixels())
+ .setColor(new ConstantColorConstraint(Color.WHITE))
+ .setChildOf(coordWindow)
+ new UIImage.ofURL(new URL(desc))
+ .setX(new CenterConstraint())
+ .setY(new AdditiveConstraint(new CenterConstraint(), (4).pixels()))
+ .setWidth((ScreenW/3.7).pixels())
+ .setHeight((ScreenH/3.7).pixels())
+ .setChildOf(coordWindow)
+ }
+ else
+ {
+ new UIWrappedText(desc)
+ .setX((2).pixels())
+ .setY((25).pixels())
+ .setWidth((ScreenW/3.7).pixels())
+ .setTextScale((1).pixels())
+ .setColor(new ConstantColorConstraint(Color.WHITE))
+ .setChildOf(coordWindow)
+ }
+
+ return coordWindow
+}
+
+export function openCoordsGui()
+{
+ ScreenW = Renderer.screen.getWidth()
+ ScreenH = Renderer.screen.getHeight()
+ const CoordsGui = new JavaAdapter(WindowScreen, {
+ init() {
+ coordsWindow(1, 1, "Spiral", "cw spiral toggle", "https://i.imgur.com/dyL30GD.png", true, "Do /cw spiral to see image. (image isn't loading.)").setChildOf(this.getWindow())
+ coordsWindow(1, 2, "Throne", "cw throne toggle", "https://i.imgur.com/7BWzO1c.jpg", true, "Go back of throne. (image isn't loading)").setChildOf(this.getWindow())
+ coordsWindow(1, 3, "Yog", "cw yog toggle", "https://i.imgur.com/DojoypL.jpg", true, "Go to the leftmost corner of the topaz crystal facing bal close to bal. (image isn't loading)").setChildOf(this.getWindow())
+ coordsWindow(2, 1, "Divans", "cw divans toggle", "https://i.imgur.com/bkC6yp3.jpg", true, "Go to the middle of jade crystal. (image isn't loading)").setChildOf(this.getWindow())
+ coordsWindow(2, 2, "Automatons", "cw automatons toggle", "https://media.discordapp.net/attachments/1049475464667856926/1052749218055475210/image.png", true, "Sit in pot somewhere (check image in command) (image isn't loading)").setChildOf(this.getWindow())
+ new UIText("Click box to enable/disable.")
+ .setX(new CenterConstraint())
+ .setY((ScreenH-ScreenH/12).pixels())
+ .setTextScale((2).pixels())
+ .setColor(Color.WHITE)
+ .setChildOf(this.getWindow())
+ },
+ })
+ CoordsGui.init()
+ GuiHandler.openGui(CoordsGui)
+} \ No newline at end of file
diff --git a/render/guis/cwGui.js b/render/guis/cwGui.js
new file mode 100644
index 0000000..a2645d5
--- /dev/null
+++ b/render/guis/cwGui.js
@@ -0,0 +1,152 @@
+import settings from "../../settings";
+import constants from "../../util/constants";
+import axios from "../../../axios"
+import { getObjectValue } from "../../util/helperFunctions"
+const cwGui = new Gui()
+let txt = "Please set your api key with /cw setkey (key)!"
+
+let cwValues = [],
+ calcCwPerHr = false,
+ upTimeTrack = false,
+ uptime = 0,
+ coleweight = 0,
+ baseColeweight = 0,
+ stepsSinceLast = 0,
+ coleweightHr = 0,
+ cwValuesSum = 0,
+ cwInfo
+
+
+export function openCwGui()
+{
+ cwGui.open()
+}
+
+
+export function reloadColeweight()
+{
+ upTimeTrack = false
+ stepsSinceLast = 0
+ cwValues = []
+ uptime = 0
+ ChatLib.chat(`${constants.PREFIX}&bReloaded!`)
+}
+
+
+register("dragged", (dx, dy, x, y) => {
+ if (!cwGui.isOpen()) return
+ constants.data.x = x
+ constants.data.y = y
+ constants.data.save()
+})
+
+register("renderOverlay", () => {
+ if (cwGui.isOpen())
+ {
+ if (constants.data.api_key != undefined)
+ txt = "Click anywhere to move!"
+ Renderer.drawStringWithShadow(txt, Renderer.screen.getWidth()/2 - Renderer.getStringWidth(txt)/2, Renderer.screen.getHeight()/2)
+ Renderer.drawStringWithShadow(txt, Renderer.screen.getWidth()/2 - Renderer.getStringWidth(txt)/2, Renderer.screen.getHeight()/2)
+ Renderer.drawStringWithShadow(`&aCW: &b0\n&aCW/hr: &b0\n&aUptime: &b0m\n&aColeweight Gained: &b0`, constants.data.x, constants.data.y)
+ }
+
+ if(!settings.cwToggle || constants.data.api_key == undefined) return
+ let coleweightMessage = "",
+ uptimeHr = Math.floor(uptime/60/60)
+
+ coleweight > 1000 ?coleweightMessage = `&b${coleweight.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')}`: coleweightMessage = `&b${coleweight.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')}`
+ if(cwValues[0] != undefined && upTimeTrack && calcCwPerHr)
+ {
+ cwValuesSum = 0
+ for(let i = 0; i < cwValues.length; i++)
+ cwValuesSum += cwValues[i]
+ let eq = Math.ceil((cwValuesSum*(3600/uptime)) * 100) / 100
+ eq != Infinity ? coleweightHr = eq : coleweightHr = "Calculating..."
+ calcCwPerHr = false
+ }
+
+ if (cwGui.isOpen() || !upTimeTrack) return
+
+ if(uptimeHr >= 1)
+ Renderer.drawStringWithShadow(`&aCW: &b${coleweightMessage}\n&aCW/hr: &b${coleweightHr}\n&aUptime: &b${uptimeHr}h ${Math.floor(uptime/60) - uptimeHr*60}m\n&aColeweight Gained: &b${Math.ceil(cwValuesSum*100) / 100}`, constants.data.x, constants.data.y)
+ else
+ Renderer.drawStringWithShadow(`&aCW: &b${coleweightMessage}\n&aCW/hr: &b${coleweightHr}\n&aUptime: &b${Math.floor(uptime/60)}m ${Math.floor(uptime%60)}s\n&aColeweight Gained: &b${Math.ceil(cwValuesSum*100) / 100}`, constants.data.x, constants.data.y)
+})
+
+register("step", () => {
+ // updates coleweight for gui
+ let date_ob = new Date(),
+ seconds = date_ob.getSeconds(),
+ cwinfo = constants.CWINFO
+
+ if(upTimeTrack == true)
+ uptime += 1
+ if((seconds == 0 || seconds == 15 || seconds == 30 || seconds == 45) && settings.cwToggle && cwinfo.length > 1)
+ {
+ try
+ {
+ let tempUuid = Player.getUUID(),
+ profileData = "",
+ tempColeweight = 0,
+ uuid = ""
+
+ for(let i = 0; i < tempUuid.length; i++)
+ {
+ if(tempUuid[i] != "-")
+ uuid += tempUuid[i]
+ }
+
+ axios.get(`https://api.hypixel.net/skyblock/profiles?key=${constants.data.api_key}&uuid=${uuid}`)
+ .then(res => {
+ for(let i=0; i < res.data.profiles.length; i+=1)
+ {
+ if(res.data.profiles[i].selected == true)
+ profileData = res.data.profiles[i]
+ }
+
+ for(let i = 0; i < cwinfo.length; i++)
+ {
+ let source = getObjectValue(profileData.members[uuid], cwinfo[i].path),
+ source2 = getObjectValue(profileData.members[uuid], cwinfo[i].path2),
+ eq
+
+ if(source == undefined) continue
+
+ eq = Math.ceil(source/cwinfo[i].cost*100) / 100
+ if(source2 != undefined)
+ eq = Math.ceil((source+source2)/cwinfo[i].cost*100) / 100
+
+ if(eq != undefined)
+ tempColeweight += eq
+ }
+
+ if(baseColeweight == 0) // case: first run
+ {
+ baseColeweight = tempColeweight
+ }
+ else if((tempColeweight - baseColeweight) > 0) // case: new coleweight
+ {
+ cwValues.push(tempColeweight - baseColeweight)
+ calcCwPerHr = true
+ upTimeTrack = true
+ stepsSinceLast = 0
+ baseColeweight = tempColeweight
+ }
+ else if(stepsSinceLast > 20) // case: over 5m have passed with no cw updates
+ {
+ uptime = 0
+ upTimeTrack = false
+ stepsSinceLast = 0
+ cwValues = []
+ }
+ else // case: none of the above
+ {
+ stepsSinceLast += 1
+ }
+
+ coleweight = Math.ceil(tempColeweight*100)/100
+ })
+ }
+ catch(e) { if(settings.debug) console.log(e) }
+ }
+}).setFps(1) \ No newline at end of file
diff --git a/render/guis/downtimeGui.js b/render/guis/downtimeGui.js
new file mode 100644
index 0000000..11be0d3
--- /dev/null
+++ b/render/guis/downtimeGui.js
@@ -0,0 +1,85 @@
+import settings from "../../settings"
+import constants from "../../util/constants"
+import { textGui } from "../../util/helperFunctions"
+
+const downtimeMoveGui = new Gui()
+const downtimeGui = new textGui()
+let oldFuel = 0,
+ timeAtLastFuel = 0,
+ overallDowntime = 0,
+ trackingDowntime = false,
+ downtime = 0,
+ downtimeCount = 0,
+ uptime = 0
+
+
+export function openDowntimeGui()
+{
+ downtimeMoveGui.open()
+}
+
+
+register("dragged", (dx, dy, x, y) => {
+ if (!downtimeMoveGui.isOpen()) return
+ constants.downtimedata.x = x
+ constants.downtimedata.y = y
+ constants.downtimedata.save()
+})
+
+register('actionbar', (xp) => {
+ if(!settings.downtimeTracker) return
+ if(Player.getHeldItem() == null) return
+ let heldItem = Player.getHeldItem().getNBT().toObject()["tag"]["ExtraAttributes"],
+ newFuel = parseInt(heldItem["drill_fuel"]) // credit to DocilElm because I'm lazy.
+
+ if(!newFuel) return
+ else if(oldFuel == 0) oldFuel = newFuel
+ else if(oldFuel !== newFuel)
+ {
+ if(timeAtLastFuel == 0)
+ {
+ timeAtLastFuel = Date.now()
+ return
+ }
+ downtime = Date.now() - timeAtLastFuel
+ overallDowntime += downtime
+ downtimeCount += 1
+ timeAtLastFuel = Date.now()
+ trackingDowntime = true
+ oldFuel = newFuel
+ }
+}).setCriteria('${*}+${xp} Mining ${*}')
+
+
+register("renderOverlay", () => {
+ if (downtimeMoveGui.isOpen())
+ {
+ let txt = "Drag to move."
+ Renderer.drawStringWithShadow(txt, Renderer.screen.getWidth()/2 - Renderer.getStringWidth(txt)/2, Renderer.screen.getHeight()/2)
+ downtimeGui.guiObject = {leftValues: ["Downtime", "Overall Downtime", "Average Downtime", "Uptime"], rightValues: [0, 0, 0, 0]}
+ downtimeGui.x = constants.downtimedata.x
+ downtimeGui.y = constants.downtimedata.y
+ downtimeGui.renderGui()
+ return
+ }
+ if (downtimeCount == 0 || !trackingDowntime || !settings.downtimeTracker) return
+ let avgDowntime = Math.ceil((overallDowntime/downtimeCount)*100) / 100
+ downtimeGui.guiObject = {leftValues: ["Downtime", "Overall Downtime", "Average Downtime", "Uptime"], rightValues: [downtime, overallDowntime, avgDowntime, uptime]}
+ downtimeGui.x = constants.downtimedata.x
+ downtimeGui.y = constants.downtimedata.y
+ downtimeGui.renderGui()
+})
+
+
+register("step", () => {
+ if((Date.now()-timeAtLastFuel)/1000 >= 60)
+ {
+ uptime = 0
+ oldFuel = 0
+ overallDowntime = 0
+ timeAtLastFuel = 0
+ trackingDowntime = false
+ } // over 60 seconds then stop making gui
+ else if(trackingDowntime)
+ uptime += 1
+}).setFps(1) \ No newline at end of file
diff --git a/render/guis/efficientMinerOverlayGui.js b/render/guis/efficientMinerOverlayGui.js
new file mode 100644
index 0000000..8c2f609
--- /dev/null
+++ b/render/guis/efficientMinerOverlayGui.js
@@ -0,0 +1,113 @@
+/*import { // after careful consideration I have decided not to make this with elementa, if anyone wants to make it for me (be it with elementa or Renderer) make https://imgur.com/a/D0XpIUx, dm Ninjune#0670 if need help
+ AdditiveConstraint,
+ CenterConstraint,
+ ConstantColorConstraint,
+ UIBlock,
+ UIImage,
+ UIWrappedText,
+ UIText,
+ WindowScreen,
+ } from "../../../Elementa"
+
+const Color = Java.type("java.awt.Color"),
+ URL = Java.type("java.net.URL"),
+ COORDS_WIDTH = 3.5, // not actually width more like reverse of width lmao, bigger = smaller
+ COORDS_HEIGHT = 2.877 // ^
+ ITEM_WIDTH = 3.5,
+ ITEM_HEIGHT = 2.877
+let ScreenW = Renderer.screen.getWidth(),
+ ScreenH = Renderer.screen.getHeight(),
+ itemCount = 0
+
+ class itemGui
+ {
+ constructor(item)
+ {
+ this.item = item
+ itemCount++
+
+ const textWindow = new UIBlock(new Color(0, 0, 0, 0.5)) // 320 960
+ .setX(new CenterConstraint())
+ .setY((ScreenH/2*itemCount + ScreenH/10.8).pixels())
+ .setWidth((ScreenW/ITEM_WIDTH).pixels())
+ .setHeight((ScreenH/ITEM_HEIGHT).pixels())
+ .onMouseClick(() => {
+ ChatLib.command(command, true)
+ })
+ new UIText(this.item, false)
+ .setX(new RelativeConstraint())
+ .setY((2).pixels())
+ .setTextScale((1).pixels())
+ .setColor(new ConstantColorConstraint(Color.WHITE))
+ .setChildOf(textWindow)
+ }
+}
+
+function coordsWindow(row, column, title, command, desc, image=false, alternateText="")
+{
+ const coordWindow = new UIBlock(new Color(0, 0, 0, 0.5)) // 320 960
+ .setX(((ScreenW/3*(column))-ScreenW/3.25).pixels())
+ .setY((ScreenH/2*(row-1)+ScreenH/10.8).pixels())
+ .setWidth((ScreenW/COORDS_WIDTH).pixels())
+ .setHeight((ScreenH/COORDS_HEIGHT).pixels())
+ .onMouseClick(() => {
+ ChatLib.command(command, true)
+ })
+ new UIText(title, false)
+ .setX(new CenterConstraint())
+ .setY((2).pixels())
+ .setTextScale((2).pixels())
+ .setColor(new ConstantColorConstraint(Color.GREEN.darker()))
+ .setChildOf(coordWindow)
+ if(image == true)
+ {
+ new UIWrappedText(alternateText)
+ .setX((12).pixels())
+ .setY((25).pixels())
+ .setWidth((ScreenW/5).pixels())
+ .setTextScale((1).pixels())
+ .setColor(new ConstantColorConstraint(Color.WHITE))
+ .setChildOf(coordWindow)
+ new UIImage.ofURL(new URL(desc))
+ .setX(new CenterConstraint())
+ .setY(new AdditiveConstraint(new CenterConstraint(), (4).pixels()))
+ .setWidth((ScreenW/3.7).pixels())
+ .setHeight((ScreenH/3.7).pixels())
+ .setChildOf(coordWindow)
+ }
+ else
+ {
+ new UIWrappedText(desc)
+ .setX((2).pixels())
+ .setY((25).pixels())
+ .setWidth((ScreenW/3.7).pixels())
+ .setTextScale((1).pixels())
+ .setColor(new ConstantColorConstraint(Color.WHITE))
+ .setChildOf(coordWindow)
+ }
+
+ return coordWindow
+}
+
+export function openCoordsGui()
+{
+ ScreenW = Renderer.screen.getWidth()
+ ScreenH = Renderer.screen.getHeight()
+ const CoordsGui = new JavaAdapter(WindowScreen, {
+ init() {
+ coordsWindow(1, 1, "Spiral", "cw spiral toggle", "https://i.imgur.com/dyL30GD.png", true, "Do /cw spiral to see image. (image isn't loading.)").setChildOf(this.getWindow())
+ coordsWindow(1, 2, "Throne", "cw throne toggle", "https://i.imgur.com/7BWzO1c.jpg", true, "Go back of throne. (image isn't loading)").setChildOf(this.getWindow())
+ coordsWindow(1, 3, "Yog", "cw yog toggle", "https://i.imgur.com/DojoypL.jpg", true, "Go to the leftmost corner of the topaz crystal facing bal close to bal. (image isn't loading)").setChildOf(this.getWindow())
+ coordsWindow(2, 1, "Divans", "cw divans toggle", "https://i.imgur.com/bkC6yp3.jpg", true, "Go to the middle of jade crystal. (image isn't loading)").setChildOf(this.getWindow())
+ coordsWindow(2, 2, "Automatons", "cw automatons toggle", "https://media.discordapp.net/attachments/1049475464667856926/1052749218055475210/image.png", true, "Sit in pot somewhere (check image in command) (image isn't loading)").setChildOf(this.getWindow())
+ new UIText("Click box to enable/disable.")
+ .setX(new CenterConstraint())
+ .setY((ScreenH-ScreenH/12).pixels())
+ .setTextScale((2).pixels())
+ .setColor(Color.WHITE)
+ .setChildOf(this.getWindow())
+ },
+ })
+ CoordsGui.init()
+ GuiHandler.openGui(CoordsGui)
+}*/ \ No newline at end of file
diff --git a/render/guis/powertrackerGui.js b/render/guis/powertrackerGui.js
new file mode 100644
index 0000000..f6bc96b
--- /dev/null
+++ b/render/guis/powertrackerGui.js
@@ -0,0 +1,116 @@
+/*
+Major credit to Fabi019 for Powdertracker module.
+*/
+import constants from "../../util/constants"
+import settings from "../../settings"
+
+const powderGui = new Gui(),
+ bossBar = Java.type("net.minecraft.entity.boss.BossStatus").field_82827_c
+
+let sessionRunning = false,
+ sessionChests = 0,
+ sessionGemstone = 0,
+ sessionMithril = 0,
+ seconds = 0,
+ timeSinceLastGain = 0
+
+export function openPowderGui()
+{
+ powderGui.open()
+}
+
+function DoublePowderActive()
+{
+ return bossBar.includes("2X POWDER")
+}
+
+register("dragged", (dx, dy, x, y) => {
+ if (!powderGui.isOpen()) return
+ constants.powderdata.x = x
+ constants.powderdata.y = y
+ constants.powderdata.save()
+})
+
+register("chat", (value, type) => {
+ let powder = parseInt(value)
+
+ if (DoublePowderActive())
+ powder *= 2
+ if(type.toLowerCase() == "gemstone")
+ {
+ constants.powderdata.gemstonePowder += powder
+ sessionGemstone += powder
+ }
+ else if (type.toLowerCase() == "mithril")
+ {
+ constants.powderdata.mithrilPowder += powder
+ sessionMithril += powder
+ }
+ constants.powderdata.save()
+ timeSinceLastGain = 0
+ sessionRunning = true
+}).setCriteria(/You received \+([0-9]+) ([a-zA-Z]+) Powder/g)
+
+register("chat", event => {
+ constants.powderdata.chests += 1
+ sessionChests += 1
+ sessionRunning = true
+}).setCriteria("&r&6You have successfully picked the lock on this chest!&r");
+
+register("renderOverlay", () => {
+ if (powderGui.isOpen())
+ {
+ let txt = "Drag to move."
+ Renderer.drawStringWithShadow(txt, Renderer.screen.getWidth()/2 - Renderer.getStringWidth(txt)/2, Renderer.screen.getHeight()/2)
+ }
+ if (!settings.trackerVisible || !sessionRunning) return
+
+ let uptimeHr = Math.floor(seconds/60/60),
+ lines = [],
+ message =""
+
+ function addText(item, value)
+ {
+ lines.push("&a" + item + ": &b" + value)
+ }
+
+ if (settings.showTotals)
+ {
+ addText("Total Chest", constants.powderdata.chests)
+ addText("Total Gemstone", constants.powderdata.gemstonePowder)
+ addText("Total Mithril", constants.powderdata.mithrilPowder)
+ }
+
+ addText("Session Chests", sessionChests)
+ addText("Session Gemstone", sessionGemstone)
+ addText("Session Mithril", sessionMithril)
+
+
+ if (settings.showRates)
+ {
+ addText("Chests/hr", Math.round(((sessionChests ?? 0)/(seconds ?? 1)) * 3600))
+ addText("Gemstone/hr", Math.round(((sessionGemstone ?? 0)/(seconds ?? 1)) * 3600))
+ addText("Mithril/hr", Math.round(((sessionMithril ?? 0)/(seconds ?? 1)) * 3600))
+ if(uptimeHr >= 1)
+ addText("Uptime", `${uptimeHr}h ${Math.floor(seconds/60) - uptimeHr*60}m`)
+ else
+ addText("Uptime", `${Math.floor(seconds/60)}m ${Math.floor(seconds%60)}s`)
+ }
+
+ lines.forEach((line) => {
+ message += line + "\n"
+ })
+ Renderer.drawStringWithShadow(message, constants.powderdata.x, constants.powderdata.y)
+})
+
+register("step", () => {
+ if(sessionRunning)
+ {
+ seconds += 1
+ timeSinceLastGain += 1
+ }
+ if(timeSinceLastGain > 300 && sessionRunning)
+ {
+ sessionRunning = false
+ }
+}).setFps(1)
diff --git a/render/guis/timerGui.js b/render/guis/timerGui.js
new file mode 100644
index 0000000..0487f2b
--- /dev/null
+++ b/render/guis/timerGui.js
@@ -0,0 +1,43 @@
+import settings from "../../settings";
+import constants from "../../util/constants";
+
+
+const timerGui = new Gui()
+
+export function openTimerGui()
+{
+ timerGui.open()
+}
+
+register("dragged", (dx, dy, x, y) => {
+ if (!timerGui.isOpen()) return
+ constants.timerdata.x = x
+ constants.timerdata.y = y
+ constants.timerdata.save()
+});
+
+register("renderOverlay", () => {
+ if (timerGui.isOpen())
+ {
+ let txt = "Drag to move."
+ Renderer.drawStringWithShadow(txt, Renderer.screen.getWidth()/2 - Renderer.getStringWidth(txt)/2, Renderer.screen.getHeight()/2)
+ }
+ if (!settings.timerVisible) return
+
+ let timerHr = Math.floor(constants.timerdata.timer/60/60), message
+
+ if(timerHr >= 1)
+ message = `&aTimer: &b${timerHr}h ${Math.floor(constants.timerdata.timer/60) - timerHr*60}m`
+ else
+ message = `&aTimer: &b${Math.floor(constants.timerdata.timer/60)}m ${Math.floor(constants.timerdata.timer%60)}s`
+
+ Renderer.drawStringWithShadow(message, constants.timerdata.x, constants.timerdata.y)
+})
+
+register('worldLoad', () => {
+ constants.timerdata.timer = 0
+})
+
+register("step", () => {
+ constants.timerdata.timer += 1
+}).setFps(1) \ No newline at end of file