aboutsummaryrefslogtreecommitdiff
path: root/src/features/betterGuis/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/features/betterGuis/index.js')
-rw-r--r--src/features/betterGuis/index.js386
1 files changed, 386 insertions, 0 deletions
diff --git a/src/features/betterGuis/index.js b/src/features/betterGuis/index.js
new file mode 100644
index 0000000..dcd8fb9
--- /dev/null
+++ b/src/features/betterGuis/index.js
@@ -0,0 +1,386 @@
+/// <reference types="../../../../CTAutocomplete" />
+/// <reference lib="es2015" />
+import Feature from "../../featureClass/class";
+import logger from "../../logger";
+import { f, m } from "../../../mappings/mappings";
+import ToggleSetting from "../settings/settingThings/toggle";
+import MuseumGui from "./museumGui.js";
+import DungeonReadyGui from "./dungeonReadyGui";
+import { SoopyGui } from "../../../guimanager";
+import TextBox from "../../../guimanager/GuiElement/TextBox";
+import SoopyNumber from "../../../guimanager/Classes/SoopyNumber";
+
+class BetterGuis extends Feature {
+ constructor() {
+ super();
+ }
+
+ inSkyblock() {
+ return this.FeatureManager.features["dataLoader"] && this.FeatureManager.features["dataLoader"].class.isInSkyblock;
+ }
+
+ onEnable() {
+ this.initVariables();
+
+ this.museumGui = new MuseumGui();
+ this.dungeonReady = new DungeonReadyGui();
+
+ this.replaceSbMenuClicks = new ToggleSetting("Improve Clicks on SBMENU", "This will change clicks to middle clicks, AND use commands where possible (eg /pets)", true, "sbmenu_clicks", this);
+ this.reliableSbMenuClicks = { getValue: () => false }//removed because hypixel fixed, code kept incase hypixel adds back bug later //new ToggleSetting("Make SBMENU clicks reliable", "This will delay clicks on sbmenu to time them so they dont get canceled", true, "sbmenu_time", this)
+
+ this.museumGuiEnabled = new ToggleSetting("Custom Museum GUI", "Custom gui for the Museum", true, "custom_museum_enabled", this);
+ this.dungeonReadyGuiEnabled = new ToggleSetting("Custom Dungeon Ready GUI", "Custom gui for the dungeon ready up menu", false, "custom_dungeon_ready_enabled", this);
+
+ this.chestSearchBar = new ToggleSetting("Inventory Search Bar", "use '&' to make it filter by stuff that contains multiple things", false, "inv_search", this);
+ this.customBars = new ToggleSetting("Custom hp and mana bar", "Also hides stuff like armor bar", false, "custom_bars", this);
+
+ this.lastWindowId = 0;
+ this.shouldHold = 10;
+ this.clickSlot = -1;
+ this.clickSlotTime = 0;
+
+ this.middleClickGuis = [
+ "Your SkyBlock Profile",
+ "Your Skills",
+ "Farming Skill",
+ "Mining Skill",
+ "Heart of the Mountain",
+ "Combat Skill",
+ "Foraging Skill",
+ "Fishing Skill",
+ "Enchanting Skill",
+ "Alchemy Skill",
+ "Carpentry Skill",
+ "Runecrafting Skill",
+ "Social Skill",
+ "Taming Skill",
+ "Dungeoneering",
+ "Your Essence",
+ "Healer Class Perks",
+ "Mage Class Perks",
+ "Beserk Class Perks",
+ "Archer Class Perks",
+ "Tank Class Perks",
+ "Recipe Book",
+ "Trades",
+ "Quest Log",
+ "Quest Log (Completed)",
+ "Fairt Souls Guide",
+ "Dungeon Journals",
+ "Calendar and Events",
+ "Booster Cookie",
+ "Island Management",
+ "Toggle Potion Effects",
+ "Bank",
+ "Bank Account Upgrades",
+ "Co-op Bank Account",
+ "Bank Deposit",
+ "Bank Withdrawal",
+ "Personal Bank Account",
+ "Bazaar Orders",
+ "Co-op Bazaar Orders",
+ "Pets"
+ ]
+ this.middleClickStartsWith = [
+ "Bestiary",
+ "Private Island",
+ "Hub",
+ "Spiders Den",
+ "Blazing Fortress",
+ "The End",
+ "Deep Caverns",
+ "The Park",
+ "Spooky Festival",
+ "Catacombs",
+ "The Catacombs",
+ "Settings",
+ "Bazaar",
+ "Farming",
+ "Mining",
+ "Woods & Fishes",
+ "Oddities"
+ ];
+ this.middleClickEndsWith = [
+ "Recipe",
+ "Recipes",
+ ") Pets",
+ "Collection",
+ "Active Effects"
+ ];
+
+ this.registerChat("&r&aDungeon starts in 1 second.&r", () =>
+ this.dungeonReady.readyInOneSecond.call(this.dungeonReady));
+ this.registerChat("&r&aDungeon starts in 1 second. Get ready!&r", () =>
+ this.dungeonReady.readyInOneSecond.call(this.dungeonReady));
+ this.registerEvent("guiMouseClick", this.guiClicked);
+ this.registerEvent("guiOpened", (event) => {
+ if (this.museumGuiEnabled.getValue()) this.museumGui.guiOpened.call(this.museumGui, event);
+ if (this.dungeonReadyGuiEnabled.getValue()) this.dungeonReady.guiOpened.call(this.dungeonReady, event);
+ });
+ this.registerEvent("worldLoad", () => this.dungeonReady.reset());
+ this.registerChat("&e${*} &r&cThe Catacombs &r&ewith &r&9${players}/5 players &r&eon &r${*}&r", (players) => {
+ if (this.dungeonReadyGuiEnabled.getValue()) this.dungeonReady.joinedDungeon.call(this.dungeonReady, ~~players);
+ })
+ this.registerChat("&eSkyBlock Dungeon Warp &r&7(${players} players)&r", (players) => {
+ if (this.dungeonReadyGuiEnabled.getValue()) this.dungeonReady.joinedDungeon.call(this.dungeonReady, ~~players)
+ })
+ this.registerStep(true, 10, this.step)
+ this.registerEvent("worldUnload", () => this.museumGui.saveMuseumCache.call(this.museumGui));
+ this.registerStep(false, 30, () => this.museumGui.saveMuseumCache.call(this.museumGui));
+
+
+ this.invSearchSoopyGui = new SoopyGui();
+ this.invSearchSoopyGui._renderBackground = () => { };
+
+ this.invSearchTextBox = new TextBox().setPlaceholder("Click to search").setLocation(0.4, 0.05, 0.2, 0.05);
+ this.invSearchSoopyGui.element.addChild(this.invSearchTextBox);
+
+ this.mana = new SoopyNumber(0);
+ this.overflowMana = new SoopyNumber(0);
+ this.maxMana = new SoopyNumber(0);
+ this.lastOverFlow = Date.now();
+
+ this.slotMatches = new Map();
+ this.registerEvent("renderHealth", this.renderHealth).registeredWhen(() => this.inSkyblock() && this.customBars.getValue());
+ this.registerEvent("renderFood", cancel).registeredWhen(() => this.inSkyblock() && this.customBars.getValue());
+ this.registerEvent("renderArmor", this.renderMana).registeredWhen(() => this.inSkyblock() && this.customBars.getValue());
+ let registerActionBar = this.registerCustom("actionbar", this.actionbarMana);
+ registerActionBar.trigger.setCriteria('&b${curr}/${max}✎').setParameter('contains');
+ let registerActionBar2 = this.registerCustom("actionbar", this.actionbarOverflowMana);
+ registerActionBar2.trigger.setCriteria('&3${curr}ʬ').setParameter('contains');
+ //&c2532/2532❤ &a798&a❈ Defense &b2525/2525✎ &31ʬ&r (100)
+ //&c2532/2532❤ &f20&f❂ True Defense &b2414/2414✎ &3600ʬ&r (13)
+ //&c2665/2665❤ &a972&a❈ Defense &b2145/2145✎ &3600ʬ&r
+ //&c2,806/2,806❤ &a1,050&a❈ Defense &b1,945/1,945✎ &3600ʬ&r
+ this.registerEvent("guiRender", this.postGuiRender).registeredWhen(() => this.chestSearchBar.getValue());
+ this.registerEvent("guiMouseClick", this.guiMouseClick).registeredWhen(() => this.chestSearchBar.getValue());
+ this.registerEvent("guiKey", this.guiKey).registeredWhen(() => this.chestSearchBar.getValue());
+ this.registerEvent("renderSlot", this.renderSlot).registeredWhen(() => this.chestSearchBar.getValue());
+ this.registerEvent("guiOpened", this.guiOpened).registeredWhen(() => this.chestSearchBar.getValue());
+ }
+
+ actionbarMana(curr, max) {
+ if (curr.includes("Mana"))
+ curr = curr.split("&b").pop();
+
+ this.mana.set(parseInt(curr.replace(/,/g, "")), 500);
+ this.maxMana.set(parseInt(max.replace(/,/g, "")), 500);
+ if (Date.now() - this.lastOverFlow > 1000) this.overflowMana.set(0, 500);
+ }
+
+ actionbarOverflowMana(curr) {
+ this.overflowMana.set(parseInt(curr.replace(/,/g, "")), 500);
+ this.lastOverFlow = Date.now();
+ }
+
+ renderMana(event) {
+ cancel(event);
+
+ let left = Renderer.screen.getWidth() / 2 + 91 - 80;
+ let top = Renderer.screen.getHeight() - 40;
+
+ Renderer.retainTransforms(true);
+ Renderer.translate(left, top);
+
+ let totalAmt = Math.max(this.maxMana.get(), this.mana.get() + this.overflowMana.get());
+
+ let manaPercent = this.mana.get() / totalAmt;
+ let ofPercent = this.overflowMana.get() / totalAmt;
+
+ Renderer.drawRect(Renderer.color(0, 0, 0), 0, 0, 80, 10);
+ Renderer.drawRect(Renderer.color(50, 50, 50), 2, 2, 76, 6);
+ Renderer.drawRect(Renderer.color(0, 0, 255), 2, 2, manaPercent * 76, 6);
+ Renderer.drawRect(Renderer.color(0, 255, 255), 2 + manaPercent * 76, 2, ofPercent * 76, 6);
+ Renderer.retainTransforms(false);
+ }
+
+ renderHealth(event) {
+ cancel(event);
+
+ let left = Renderer.screen.getWidth() / 2 - 91;
+ let top = Renderer.screen.getHeight() - 40;
+
+ Renderer.retainTransforms(true);
+ Renderer.translate(left, top);
+
+ let totalAmt = Math.max(Player.asPlayerMP().getMaxHP(), Player.getHP() + Player.asPlayerMP().getAbsorption());
+
+ let hpPercent = Player.getHP() / totalAmt;
+ let abPercent = Player.asPlayerMP().getAbsorption() / totalAmt;
+
+
+ Renderer.drawRect(Renderer.color(0, 0, 0), 0, 0, 80, 10);
+ Renderer.drawRect(Renderer.color(50, 50, 50), 2, 2, 76, 6);
+ Renderer.drawRect(Renderer.color(255, 0, 0), 2, 2, hpPercent * 76, 6);
+ Renderer.drawRect(Renderer.color(255, 255, 0), 2 + hpPercent * 76, 2, abPercent * 76, 6);
+
+ Renderer.retainTransforms(false);
+ }
+
+ postGuiRender(x, y, gui) {
+ if (gui instanceof net.minecraft.client.gui.inventory.GuiChest)
+ this.invSearchSoopyGui._render(x, y, 0);
+ }
+ guiMouseClick(x, y, button, gui) {
+ if (gui instanceof net.minecraft.client.gui.inventory.GuiChest)
+ this.invSearchSoopyGui._onClick(x, y, button);
+ }
+ guiKey(char, code, gui, event) {
+ if (!(gui instanceof net.minecraft.client.gui.inventory.GuiChest)) return;
+
+ this.invSearchSoopyGui._onKeyPress(char, code);
+
+ if (this.invSearchTextBox.text.selected) {
+ cancel(event);
+ this.slotMatches.clear();
+ }
+ }
+ guiOpened() {
+ this.slotMatches.clear();
+ }
+
+ renderSlot(slot, gui, event) {
+ if (!(gui instanceof net.minecraft.client.gui.inventory.GuiChest)) return;
+ if (!this.invSearchTextBox.getText()) return;
+
+ let searchText = this.invSearchTextBox.getText().toLowerCase();
+
+ let isMatching = false;
+ let slotMatches = this.slotMatches.get(slot.getIndex());
+ if (slotMatches && Date.now() - slotMatches.timestamp < 500) {
+ if (!slotMatches.isMatching) {
+ Renderer.translate(0, 0, 100);
+ Renderer.drawRect(Renderer.color(0, 0, 0, 200), slot.getDisplayX(), slot.getDisplayY(), 8 * Renderer.screen.getScale(), 8 * Renderer.screen.getScale());
+ }
+ return;
+ }
+ let item = slot.getItem();
+ if (item) {
+ isMatching = !searchText.split("&").map(a => {
+ a = a.trim();
+ let isMatching2 = false;
+ if (ChatLib.removeFormatting(item.getName()).toLowerCase().includes(a)) isMatching2 = true;
+ if (!isMatching2 && item.getLore().some(b => ChatLib.removeFormatting(b).toLowerCase().includes(a))) isMatching2 = true;
+ return isMatching2;
+ }).includes(false);
+ }
+
+ this.slotMatches.set(slot.getIndex(), { isMatching, timestamp: Date.now() });
+
+ if (!isMatching) {
+ Renderer.translate(0, 0, 100);
+ Renderer.drawRect(Renderer.color(0, 0, 0, 200), slot.getDisplayX(), slot.getDisplayY(), 8 * Renderer.screen.getScale(), 8 * Renderer.screen.getScale());
+ }
+ }
+
+ guiClicked(mouseX, mouseY, button, gui, event) {
+ if (!(gui instanceof net.minecraft.client.gui.inventory.GuiChest) || button !== 0 || !this.replaceSbMenuClicks.getValue()) return;
+
+ let hoveredSlot = gui.getSlotUnderMouse();
+ if (!hoveredSlot) return;
+
+ let hoveredSlotId = hoveredSlot[f.slotNumber];
+
+ // logger.logMessage(hoveredSlotId, 4)
+
+ if (this.guiSlotClicked(ChatLib.removeFormatting(Player.getContainer().getName()), hoveredSlotId))
+ cancel(event);
+ }
+
+ step() {
+ if (this.museumGuiEnabled.getValue()) this.museumGui.tick.call(this.museumGui);
+ if (this.dungeonReadyGuiEnabled.getValue()) this.dungeonReady.tick.call(this.dungeonReady);
+
+ if (!this.replaceSbMenuClicks.getValue()) return
+ if (Player.getContainer() && Player.getContainer().getName() !== "SkyBlock Menu") {
+ this.lastWindowId = 0;
+ return;
+ }
+ if (this.lastWindowId === 0) {
+ this.lastWindowId = Player.getContainer().getWindowId();
+ return;
+ }
+ if (Player.getContainer().getWindowId() === this.lastWindowId) {
+ this.shouldHold--
+ return;
+ }
+
+ this.lastWindowId = Player.getContainer().getWindowId();
+ this.shouldHold += 10;
+ if (Date.now() - this.clickSlotTime > 1000) {
+ this.clickSlot = -1;
+ }
+ if (this.clickSlot && this.clickSlot != -1) {
+ Player.getContainer().click(this.clickSlot, false, "MIDDLE");
+ this.clickSlot = -1;
+ }
+ }
+
+ guiSlotClicked(inventoryName, slotId) {
+ if (inventoryName.endsWith(" Sack")) return false
+ switch (inventoryName) {
+ case "SkyBlock Menu":
+ switch (slotId) {
+ case 30:
+ ChatLib.command("pets")
+ break
+ case 25:
+ ChatLib.command("storage")
+ break
+ default:
+ if (this.shouldHold > 0 && this.reliableSbMenuClicks.getValue()) {
+ this.clickSlot = slotId
+ this.clickSlotTime = Date.now()
+ } else {
+ Player.getContainer().click(slotId, false, "MIDDLE")
+ }
+ break;
+ }
+ return true
+ break
+ default:
+ if (this.middleClickGuis.includes(inventoryName)) {
+ Player.getContainer().click(slotId, false, "MIDDLE")
+ return true
+ }
+ for (let thing of this.middleClickStartsWith) {
+ if (inventoryName.startsWith(thing)) {
+ Player.getContainer().click(slotId, false, "MIDDLE")
+ return true
+ }
+ }
+ for (let thing of this.middleClickEndsWith) {
+ if (inventoryName.endsWith(thing)) {
+ Player.getContainer().click(slotId, false, "MIDDLE")
+ return true
+ }
+ }
+ return false
+ break
+ }
+ }
+
+ initVariables() {
+ this.replaceSbMenuClicks = undefined;
+ this.lastWindowId = undefined;
+ this.shouldHold = undefined;
+ this.clickSlot = undefined;
+ this.clickSlotTime = undefined;
+ this.reliableSbMenuClicks = undefined;
+ this.middleClickGuis = undefined;
+ this.middleClickStartsWith = undefined;
+ this.middleClickEndsWith = undefined;
+
+ this.museumGui = undefined;
+ }
+
+ onDisable() {
+ this.initVariables();
+
+ this.invSearchSoopyGui.delete();
+ }
+}
+
+module.exports = {
+ class: new BetterGuis()
+} \ No newline at end of file