diff options
author | Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> | 2021-11-06 18:15:47 +0800 |
---|---|---|
committer | Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> | 2021-11-06 18:15:47 +0800 |
commit | b33a75b2eba88c60280fcd441a5dd974cf763ab4 (patch) | |
tree | 53bd51697f69596fdcc388cdc71cc91b745f8f67 | |
parent | bae481562a9186cafebdde2be9ac53b93cb98885 (diff) | |
download | SoopyV2-b33a75b2eba88c60280fcd441a5dd974cf763ab4.tar.gz SoopyV2-b33a75b2eba88c60280fcd441a5dd974cf763ab4.tar.bz2 SoopyV2-b33a75b2eba88c60280fcd441a5dd974cf763ab4.zip |
Added update notif, cosmetics, and unfinished museum overlay
-rw-r--r-- | features/betterGuis/index.js | 16 | ||||
-rw-r--r-- | features/betterGuis/museumGui.js | 393 | ||||
-rw-r--r-- | features/changeLogGUI/index.js | 48 | ||||
-rw-r--r-- | features/cosmetics/cosmetic.js | 20 | ||||
-rw-r--r-- | features/cosmetics/dragonWings.js | 291 | ||||
-rw-r--r-- | features/cosmetics/hiddenRequirement.js | 5 | ||||
-rw-r--r-- | features/cosmetics/index.js | 146 | ||||
-rw-r--r-- | features/cosmetics/metadata.json | 8 | ||||
-rw-r--r-- | features/globalSettings/index.js | 3 | ||||
-rw-r--r-- | features/soopyGui/index.js | 14 | ||||
-rw-r--r-- | logger.js | 8 | ||||
-rw-r--r-- | metadata.json | 4 | ||||
-rw-r--r-- | utils/utils.js | 7 |
13 files changed, 948 insertions, 15 deletions
diff --git a/features/betterGuis/index.js b/features/betterGuis/index.js index 8600499..9648a9a 100644 --- a/features/betterGuis/index.js +++ b/features/betterGuis/index.js @@ -1,8 +1,8 @@ /// <reference types="../../../CTAutocomplete" /> /// <reference lib="es2015" /> import Feature from "../../featureClass/class"; -import { drawBoxAtBlockNotVisThruWalls } from "../../utils/renderUtils"; import ToggleSetting from "../settings/settingThings/toggle"; +import MuseumGui from "./museumGui"; class BetterGuis extends Feature { constructor() { @@ -12,8 +12,12 @@ class BetterGuis extends Feature { onEnable(){ this.initVariables() + this.museumGui = new MuseumGui() + 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 may add back 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 = {getValue: ()=>false} //Removed because not finished yet new ToggleSetting("Custom Museum GUI", "Custom gui for the Museum", true, "custom_museum_enabled", this) this.lastWindowId = 0 this.shouldHold = 10 @@ -89,6 +93,12 @@ class BetterGuis extends Feature { ] this.registerEvent("guiMouseClick", this.guiClicked) + this.registerEvent("guiOpened", (event)=>{ + if(this.museumGuiEnabled.getValue()) this.museumGui.guiOpened.call(this.museumGui, event) + }) + this.registerEvent("tick", ()=>{ + if(this.museumGuiEnabled.getValue()) this.museumGui.tick.call(this.museumGui) + }) this.registerStep(true, 10, this.step) } @@ -99,7 +109,7 @@ class BetterGuis extends Feature { if(!hoveredSlot) return let hoveredSlotId = hoveredSlot.field_75222_d - // console.log(hoveredSlotId) + console.log(hoveredSlotId) if(this.guiSlotClicked(ChatLib.removeFormatting(Player.getOpenedInventory().getName()), hoveredSlotId)){ cancel(event) } @@ -185,6 +195,8 @@ class BetterGuis extends Feature { this.middleClickGuis = undefined this.middleClickStartsWith = undefined this.middleClickEndsWith = undefined + + this.museumGui = undefined } onDisable(){ diff --git a/features/betterGuis/museumGui.js b/features/betterGuis/museumGui.js new file mode 100644 index 0000000..c3c47d0 --- /dev/null +++ b/features/betterGuis/museumGui.js @@ -0,0 +1,393 @@ +import { SoopyGui, SoopyRenderEvent } from "../../../guimanager" +import SoopyKeyPressEvent from "../../../guimanager/EventListener/SoopyKeyPressEvent" +import SoopyMouseClickEvent from "../../../guimanager/EventListener/SoopyMouseClickEvent" +import ButtonWithArrow from "../../../guimanager/GuiElement/ButtonWithArrow" +import ProgressBar from "../../../guimanager/GuiElement/ProgressBar" +import SoopyBoxElement from "../../../guimanager/GuiElement/SoopyBoxElement" +import SoopyGuiElement from "../../../guimanager/GuiElement/SoopyGuiElement" +import SoopyTextElement from "../../../guimanager/GuiElement/SoopyTextElement" +import renderLibs from "../../../guimanager/renderLibs" +import utils from "../../utils/utils" + +class MuseumGui { + constructor(){ + this.checkMenu = false + + this.isInMuseum = false + this.guiOpenTickThing = false + this.dontOpen = 0 + this.lastClosed = 0 + this.itemsInPages = {} + + this.soopyGui = new SoopyGui() + + this.soopyGui.element.addEvent(new SoopyKeyPressEvent().setHandler((...args)=>{ + this.keyPress(...args) + })) + + this.mainPage = new SoopyGuiElement().setLocation(0,0,1,1) + this.soopyGui.element.addChild(this.mainPage) + + let widthPer = 0.2 + let leftOffset = (1-widthPer*3-widthPer*4/5)/2 + + this.weaponsIndicator = new SoopyBoxElement().setLocation(leftOffset, 0.05, widthPer*4/5, 0.15) + this.weaponsIndicator.addEvent(new SoopyRenderEvent().setHandler(()=>{ + if(this.weaponsIndicator.hovered && ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName()) !== "Weapons"){ + this.weaponText.location.location.x.set(0.05, 500) + this.weaponText.location.size.x.set(0.9, 500) + this.weaponText.location.location.y.set(0.025, 500) + this.weaponText.location.size.y.set(0.35, 500) + + this.weaponsIndicator.setColorOffset(-20, -20, -20, 100) + + Renderer.translate(0,0,100) + Renderer.drawRect(Renderer.color(0,0,0,100), this.weaponsIndicator.location.getXExact(), this.weaponsIndicator.location.getYExact(), this.weaponsIndicator.location.getWidthExact(), this.weaponsIndicator.location.getHeightExact()) + let clicks = ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName())==="Museum"?"1":"2" + Renderer.translate(0,0,100) + renderLibs.drawStringCenteredFull(clicks, this.weaponsIndicator.location.getXExact()+this.weaponsIndicator.location.getWidthExact()/2, this.weaponsIndicator.location.getYExact()+this.weaponsIndicator.location.getHeightExact()/2, Math.min(this.weaponsIndicator.location.getWidthExact()/Renderer.getStringWidth(clicks)/4, this.weaponsIndicator.location.getHeightExact()/4/2)) + }else{ + this.weaponText.location.location.x.set(0.1, 500) + this.weaponText.location.size.x.set(0.8, 500) + this.weaponText.location.location.y.set(0.05, 500) + this.weaponText.location.size.y.set(0.3, 500) + + this.weaponsIndicator.setColorOffset(0, 0, 0, 100) + } + })).addEvent(new SoopyMouseClickEvent().setHandler(()=>{ + this.clickedTopButton("Weapons") + })) + + this.weaponText = new SoopyTextElement().setText("§5Weapons").setMaxTextScale(10).setLocation(0.1,0.05,0.8,0.3) + this.weaponsIndicator.addChild(this.weaponText) + this.weaponsPercentageText = new SoopyTextElement().setLocation(0.1,0.4,0.8,0.2).setText("§0Items Donated: §7Loading...").setMaxTextScale(10) + this.weaponsIndicator.addChild(this.weaponsPercentageText) + this.weaponsProgressBar = new ProgressBar().setLocation(0.1,0.6,0.8,0.35).showPercentage(true) + this.weaponsIndicator.addChild(this.weaponsProgressBar) + this.mainPage.addChild(this.weaponsIndicator) + + this.armourIndicator = new SoopyBoxElement().setLocation(leftOffset+widthPer, 0.05, widthPer*4/5, 0.15) + this.armourIndicator.addEvent(new SoopyRenderEvent().setHandler(()=>{ + if(this.armourIndicator.hovered && ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName()) !== "Armor Sets"){ + this.armourText.location.location.x.set(0.05, 500) + this.armourText.location.size.x.set(0.9, 500) + this.armourText.location.location.y.set(0.025, 500) + this.armourText.location.size.y.set(0.35, 500) + + this.armourIndicator.setColorOffset(-20, -20, -20, 100) + + Renderer.translate(0,0,100) + Renderer.drawRect(Renderer.color(0,0,0,100), this.armourIndicator.location.getXExact(), this.armourIndicator.location.getYExact(), this.armourIndicator.location.getWidthExact(), this.armourIndicator.location.getHeightExact()) + let clicks = ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName())==="Museum"?"1":"2" + Renderer.translate(0,0,100) + renderLibs.drawStringCenteredFull(clicks, this.armourIndicator.location.getXExact()+this.armourIndicator.location.getWidthExact()/2, this.armourIndicator.location.getYExact()+this.armourIndicator.location.getHeightExact()/2, Math.min(this.armourIndicator.location.getWidthExact()/Renderer.getStringWidth(clicks)/4, this.armourIndicator.location.getHeightExact()/4/2)) + }else{ + this.armourText.location.location.x.set(0.1, 500) + this.armourText.location.size.x.set(0.8, 500) + this.armourText.location.location.y.set(0.05, 500) + this.armourText.location.size.y.set(0.3, 500) + + this.armourIndicator.setColorOffset(0, 0, 0, 100)} + })).addEvent(new SoopyMouseClickEvent().setHandler(()=>{ + this.clickedTopButton("Armor Sets") + })) + + this.armourText = new SoopyTextElement().setText("§5Armor Sets").setMaxTextScale(10).setLocation(0.1,0.05,0.8,0.3) + this.armourIndicator.addChild(this.armourText) + this.armourPercentageText = new SoopyTextElement().setLocation(0.1,0.4,0.8,0.2).setText("§0Items Donated: §7Loading...").setMaxTextScale(10) + this.armourIndicator.addChild(this.armourPercentageText) + this.armourProgressBar = new ProgressBar().setLocation(0.1,0.6,0.8,0.35).showPercentage(true) + this.armourIndicator.addChild(this.armourProgressBar) + this.mainPage.addChild(this.armourIndicator) + + this.raritiesIndicator = new SoopyBoxElement().setLocation(leftOffset+widthPer*2, 0.05, widthPer*4/5, 0.15) + this.raritiesIndicator.addEvent(new SoopyRenderEvent().setHandler(()=>{ + if(this.raritiesIndicator.hovered && ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName()) !== "Rarities"){ + this.raritiesText.location.location.x.set(0.05, 500) + this.raritiesText.location.size.x.set(0.9, 500) + this.raritiesText.location.location.y.set(0.025, 500) + this.raritiesText.location.size.y.set(0.35, 500) + + this.raritiesIndicator.setColorOffset(-20, -20, -20, 100) + + Renderer.translate(0,0,100) + Renderer.drawRect(Renderer.color(0,0,0,100), this.raritiesIndicator.location.getXExact(), this.raritiesIndicator.location.getYExact(), this.raritiesIndicator.location.getWidthExact(), this.raritiesIndicator.location.getHeightExact()) + let clicks = ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName())==="Museum"?"1":"2" + Renderer.translate(0,0,100) + renderLibs.drawStringCenteredFull(clicks, this.raritiesIndicator.location.getXExact()+this.raritiesIndicator.location.getWidthExact()/2, this.raritiesIndicator.location.getYExact()+this.raritiesIndicator.location.getHeightExact()/2, Math.min(this.raritiesIndicator.location.getWidthExact()/Renderer.getStringWidth(clicks)/4, this.raritiesIndicator.location.getHeightExact()/4/2)) + }else{ + this.raritiesText.location.location.x.set(0.1, 500) + this.raritiesText.location.size.x.set(0.8, 500) + this.raritiesText.location.location.y.set(0.05, 500) + this.raritiesText.location.size.y.set(0.3, 500) + + this.raritiesIndicator.setColorOffset(0, 0, 0, 100) + } + })).addEvent(new SoopyMouseClickEvent().setHandler(()=>{ + this.clickedTopButton("Rarities") + })) + + this.raritiesText = new SoopyTextElement().setText("§5Rarities").setMaxTextScale(10).setLocation(0.1,0.05,0.8,0.3) + this.raritiesIndicator.addChild(this.raritiesText) + this.raritiesPercentageText = new SoopyTextElement().setLocation(0.1,0.4,0.8,0.2).setText("§0Items Donated: §7Loading...").setMaxTextScale(10) + this.raritiesIndicator.addChild(this.raritiesPercentageText) + this.raritiesProgressBar = new ProgressBar().setLocation(0.1,0.6,0.8,0.35).showPercentage(true) + this.raritiesIndicator.addChild(this.raritiesProgressBar) + this.mainPage.addChild(this.raritiesIndicator) + + this.specialIndicator = new SoopyBoxElement().setLocation(leftOffset+widthPer*3, 0.05, widthPer*4/5, 0.15) + this.specialIndicator.addEvent(new SoopyRenderEvent().setHandler(()=>{ + if(this.specialIndicator.hovered && ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName()) !== "Special Items"){ + this.specialText.location.location.x.set(0.05, 500) + this.specialText.location.size.x.set(0.9, 500) + this.specialText.location.location.y.set(0.025, 500) + this.specialText.location.size.y.set(0.35, 500) + + this.specialIndicator.setColorOffset(-20, -20, -20, 100) + + Renderer.translate(0,0,100) + Renderer.drawRect(Renderer.color(0,0,0,100), this.specialIndicator.location.getXExact(), this.specialIndicator.location.getYExact(), this.specialIndicator.location.getWidthExact(), this.specialIndicator.location.getHeightExact()) + let clicks = ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName())==="Museum"?"1":"2" + Renderer.translate(0,0,100) + renderLibs.drawStringCenteredFull(clicks, this.specialIndicator.location.getXExact()+this.specialIndicator.location.getWidthExact()/2, this.specialIndicator.location.getYExact()+this.specialIndicator.location.getHeightExact()/2, Math.min(this.specialIndicator.location.getWidthExact()/Renderer.getStringWidth(clicks)/4, this.specialIndicator.location.getHeightExact()/4/2)) + + }else{ + this.specialText.location.location.x.set(0.1, 500) + this.specialText.location.size.x.set(0.8, 500) + this.specialText.location.location.y.set(0.05, 500) + this.specialText.location.size.y.set(0.3, 500) + + this.specialIndicator.setColorOffset(0, 0, 0, 100) + } + })).addEvent(new SoopyMouseClickEvent().setHandler(()=>{ + this.clickedTopButton("Special Items") + })) + + this.specialText = new SoopyTextElement().setText("§5Special Items").setMaxTextScale(10).setLocation(0.1,0.05,0.8,0.3) + this.specialIndicator.addChild(this.specialText) + this.specialPercentageText = new SoopyTextElement().setLocation(0.1,0.4,0.8,0.6).setText("§0Items Donated: §7Loading...").setMaxTextScale(10) + this.specialIndicator.addChild(this.specialPercentageText) + this.mainPage.addChild(this.specialIndicator) + + let box = new SoopyBoxElement().setLocation(0.5-widthPer/2, 0.25, widthPer, 0.075) + this.pageTitle = new SoopyTextElement().setText("§5Museum").setMaxTextScale(10).setLocation(0,0,1,1) + box.addChild(this.pageTitle) + this.mainPage.addChild(box) + + this.itemsBox = new SoopyBoxElement().setLocation(0.5-widthPer*3/2, 0.35, widthPer*3, 0.6).setScrollable(true) + this.mainPage.addChild(this.itemsBox) + } + + clickedTopButton(type){ + if(ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName())===type) return + + if(ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName())==="Museum"){ + //if on main page can just directly click on it + switch(type){ + case "Weapons": + Player.getOpenedInventory().click(19, false, "MIDDLE") + break + case "Armor Sets": + Player.getOpenedInventory().click(21, false, "MIDDLE") + break + case "Rarities": + Player.getOpenedInventory().click(23, false, "MIDDLE") + break + case "Special Items": + Player.getOpenedInventory().click(25, false, "MIDDLE") + break + } + }else{ + Player.getOpenedInventory().click(48, false, "MIDDLE") + } + } + + tickMenu(){ + this.pageTitle.setText("§5"+ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName())) + if(ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName())==="Museum"){ + if(!Player.getOpenedInventory().getStackInSlot(19)) return + + let lore = Player.getOpenedInventory().getStackInSlot(19).getLore() + lore.forEach((line, i)=>{ + if(i===0) return + + if(line.split(" ")?.[1]?.includes("/")){ + let data = ChatLib.removeFormatting(line).split(" ")[1].split("/") + + this.weaponsProgressBar.setProgress(parseInt(data[0])/parseInt(data[1])) + this.weaponsPercentageText.setText("§0Items Donated: §7"+data[0]+"/"+data[1]) + } + }) + this.weaponsIndicator.setLore(lore) + + lore = Player.getOpenedInventory().getStackInSlot(21).getLore() + lore.forEach((line, i)=>{ + if(i===0) return + + if(line.split(" ")?.[1]?.includes("/")){ + let data = ChatLib.removeFormatting(line).split(" ")[1].split("/") + + this.armourProgressBar.setProgress(parseInt(data[0])/parseInt(data[1])) + this.armourPercentageText.setText("§0Items Donated: §7"+data[0]+"/"+data[1]) + } + }) + this.armourIndicator.setLore(lore) + + lore = Player.getOpenedInventory().getStackInSlot(23).getLore() + lore.forEach((line, i)=>{ + if(i===0) return + + if(line.split(" ")?.[1]?.includes("/")){ + let data = ChatLib.removeFormatting(line).split(" ")[1].split("/") + + this.raritiesProgressBar.setProgress(parseInt(data[0])/parseInt(data[1])) + this.raritiesPercentageText.setText("§0Items Donated: §7"+data[0]+"/"+data[1]) + } + }) + this.raritiesIndicator.setLore(lore) + + lore = Player.getOpenedInventory().getStackInSlot(25).getLore() + lore.forEach((line, i)=>{ + if(i===0) return + + if(ChatLib.removeFormatting(line).startsWith("Items Donated: ")){ + this.specialPercentageText.setText("§0Items Donated: §7"+ChatLib.removeFormatting(line).split(": ")[1]) + } + }) + this.specialIndicator.setLore(lore) + } + + let itempages = ["Weapons", "Armor Sets", "Rarities", "Special Items"] + if(itempages.includes(ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName()))){ + let page = ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName()) + let pageNum = 0 + Player.getOpenedInventory().getStackInSlot(45).getLore().forEach(line=>{ + if(ChatLib.removeFormatting(line).startsWith("Page ")) pageNum = parseInt(ChatLib.removeFormatting(line).split(" ")[1])+1 + }) + Player.getOpenedInventory().getStackInSlot(53).getLore().forEach(line=>{ + if(ChatLib.removeFormatting(line).startsWith("Page ")) pageNum = parseInt(ChatLib.removeFormatting(line).split(" ")[1])-1 + }) + + if(!this.itemsInPages[page]) this.itemsInPages[page] = [] + + //10-16 43 + let changed = false + for(let i = 0;i<3;i++){ + for(let j = 10;j<16;j++){ + let slot = i*9+j + let item = Player.getOpenedInventory().getStackInSlot(slot) + let sb_id = utils.getSBID(item) + if(sb_id){ + if(!this.itemsInPages[page][pageNum]) this.itemsInPages[page][pageNum] = [] + if(!this.itemsInPages[page][pageNum][i]) this.itemsInPages[page][pageNum][i] = [] + + let itemData = { + sb_id: sb_id, + name: item.getName(), + lore: item.getLore() + } + + if(JSON.stringify(this.itemsInPages[page][pageNum][i][j]) !== JSON.stringify(itemData)){ + this.itemsInPages[page][pageNum][i][j] = itemData + + changed = true + } + } + } + } + if(changed) this.regenItems() + } + } + + regenItems(){ + this.itemsBox.clearChildren() + + let page = ChatLib.removeFormatting(Player.getOpenedInventory().getStackInSlot(4).getName()) + + let y = 0.1 + let itemNum = 0 + let width = 2 + let widthPer = 0.9/(width+1) + let offset = 0.0125 + + this.itemsInPages[page].forEach(page=>{ + if(page === null) return + page.forEach(row=>{ + if(row === null) return + row.forEach(slot=>{ + if(slot === null) return + + let child = new ButtonWithArrow().setText(slot.name.startsWith("§f")?"&7"+slot.name.substr(2):slot.name).setLore(slot.lore).setLocation(0.05+offset+widthPer*itemNum,y,widthPer*9/10,0.15) + this.itemsBox.addChild(child) + + itemNum++ + if(itemNum>width){ + itemNum = 0 + y+=0.175 + } + }) + }) + }) + } + + guiOpened(event){ + if(this.dontOpen > 0){ + this.dontOpen-- + return + } + if(this.soopyGui.ctGui.isOpen()){ + cancel(event) + // this.soopyGui.ctGui.open() + return + } + if(this.isInMuseum){ + this.soopyGui.ctGui.open() + }else{ + this.checkMenu = true + } + } + + keyPress(key, keyId){ + if(keyId === 1){ //escape key + this.isInMuseum = false + this.dontOpen = 3 + } + } + + tick(){ + if(this.isInMuseum){ + if(this.soopyGui.ctGui.isOpen() || this.guiOpenTickThing){ + this.tickMenu() + + this.guiOpenTickThing = false + }else{ + // Client.currentGui.close() + this.isInMuseum = false + + this.lastClosed = Date.now() + } + } + + if(!(this.soopyGui.ctGui.isOpen() || this.guiOpenTickThing) && Date.now()-this.lastClosed > 1000){ + this.weaponsProgressBar.setProgress(0) + this.armourProgressBar.setProgress(0) + this.raritiesProgressBar.setProgress(0) + } + + if(this.checkMenu){ + if(Player.getOpenedInventory().getName() === "Your Museum" && !this.isInMuseum){ + this.isInMuseum = true + + this.soopyGui.open() + this.guiOpenTickThing = true + } + this.checkMenu = false + } + + if(this.dontOpen > 0){ + Client.currentGui.close() + } + } +} + +export default MuseumGui;
\ No newline at end of file diff --git a/features/changeLogGUI/index.js b/features/changeLogGUI/index.js index f6595b0..daecf96 100644 --- a/features/changeLogGUI/index.js +++ b/features/changeLogGUI/index.js @@ -24,6 +24,34 @@ class ChangeLogGui extends Feature { this.initVariables() this.ChangelogPage = new ChangelogPage() + + this.latestAnnouncedVersion = this.ChangelogPage.currVersionId + + this.registerEvent("worldLoad", this.worldLoad) + } + + worldLoad(){ + if(!this.FeatureManager.features["globalSettings"]) return + if(!this.FeatureManager.features["globalSettings"].class.notifyNewVersion.getValue()) return + if(this.ChangelogPage.downloadableVersion === -1) return + if(this.latestAnnouncedVersion < this.ChangelogPage.downloadableVersion){ + let version = "" + this.ChangelogPage.changelogData.forEach(data=>{ + + if(this.ChangelogPage.downloadableVersion === data.versionId && this.ChangelogPage.downloadableVersion > this.ChangelogPage.currVersionId){ + //add button to download this version + version = data.version + } + }) + + ChatLib.chat("&1" + ChatLib.getChatBreak("-").substr(1)) + ChatLib.chat(" &6New Soopyaddons Version is avalible (" + version + ")") + ChatLib.chat("") + new TextComponent(" &e[CLICK] &7- View changelog and download update").setHover("show_text", "&2Open changelog").setClick("run_command", "/soopyv2 changelog").chat() + ChatLib.chat("&1" + ChatLib.getChatBreak("-").substr(1)) + + this.latestAnnouncedVersion = this.ChangelogPage.downloadableVersion + } } initVariables(){ @@ -45,7 +73,7 @@ class ChangelogPage extends GuiPage { this.pages = [this.newPage()] this.changelogData = [] - this.downloadableVersion = 0 + this.downloadableVersion = -1 let changelogTitle = new SoopyTextElement().setText("§0Changelog").setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.1) this.pages[0].addChild(changelogTitle) @@ -92,15 +120,21 @@ This is fine if you trust me to not put a virus in it, but if you dont you shoul this.currVersionId = metadata.versionId this.finaliseLoading() + + this.loadChangeLog() } - onOpen(){ - new Thread(()=>{ - let data = JSON.parse(FileLib.getUrlContent("http://soopymc.my.to/api/soopyv2/changelog.json")) + loadChangeLog(){ + let data = JSON.parse(FileLib.getUrlContent("http://soopymc.my.to/api/soopyv2/changelog.json")) + + this.changelogData = data.changelog.reverse() - this.changelogData = data.changelog.reverse() + this.downloadableVersion = data.downloadableVersion + } - this.downloadableVersion = data.downloadableVersion + onOpen(){ + new Thread(()=>{ + this.loadChangeLog() this.updateText() }).start() @@ -140,7 +174,7 @@ This is fine if you trust me to not put a virus in it, but if you dont you shoul this.progressBar.setProgress(0.75) FileLib.deleteDirectory(new File("./config/ChatTriggers/modules/SoopyV2")) - + this.progressBar.setProgress(0.9) new File("./config/ChatTriggers/modules/SoopyAddonsTempDownload/SoopyAddons/SoopyV2").renameTo(new File("./config/ChatTriggers/modules/SoopyV2")) diff --git a/features/cosmetics/cosmetic.js b/features/cosmetics/cosmetic.js new file mode 100644 index 0000000..4b52fa8 --- /dev/null +++ b/features/cosmetics/cosmetic.js @@ -0,0 +1,20 @@ +class Cosmetic{ + constructor(player, parent){ + /** + * @type {PlayerMP | Player} + */ + this.player = player + + this.parent = parent + } + + onRender(){ + //override + } + + onTick(){ + //override + } +} + +export default Cosmetic;
\ No newline at end of file diff --git a/features/cosmetics/dragonWings.js b/features/cosmetics/dragonWings.js new file mode 100644 index 0000000..d9e8a1c --- /dev/null +++ b/features/cosmetics/dragonWings.js @@ -0,0 +1,291 @@ +import Cosmetic from "./cosmetic"; + +const ModelDragon = Java.type("net.minecraft.client.model.ModelDragon") +const ResourceLocation = Java.type("net.minecraft.util.ResourceLocation") + +const GlStateManager = Java.type("net.minecraft.client.renderer.GlStateManager"); + +const FACING = Java.type("net.minecraft.block.BlockDirectional").field_176387_N +let dragon = new ModelDragon(0) //too lazy to make my own model so i just yoink it from modelDragon lmfao +let textures = new ResourceLocation("textures/entity/enderdragon/dragon.png") +let wing = getField(dragon, "field_78225_k") +let wingTip = getField(dragon, "field_78222_l") + +class DragonWings extends Cosmetic { + constructor(player, parent) { + super(player, parent); + + this.settings = this.parent.getPlayerCosmeticSettings(this.player, "dragon_wings") + + this.animOffset = Math.random()*20*Math.PI + this.lastRender = Date.now() + + this.lastFlapSound = this.animOffset + } + onRender(ticks){ + + if(this.settings.disableWithNoChestplate && this.player.getPlayer().func_82169_q(2) === null && !(this.player === Player && Client.getMinecraft().field_71474_y.field_74320_O === 0)){ + return + } + + if(this.player.getPlayer().func_98034_c(Player.getPlayer())){ + return + } + + if(!this.parent.firstPersonVisable.getValue() && this.player === Player && Client.getMinecraft().field_71474_y.field_74320_O === 0){ + return + } + + // return; + // wing.func_78785_a(1) + + let timeSince = (Date.now()-this.lastRender)/1000 + this.lastRender = Date.now() + + let rotation = this.player.getPlayer().field_70761_aq+(this.player.getPlayer().field_70761_aq-this.player.getPlayer().field_70760_ar)*ticks + + let horisontalSpeed = Math.sqrt((this.player.getPlayer().field_70165_t-this.player.getPlayer().field_70142_S)**2+(this.player.getPlayer().field_70161_v-this.player.getPlayer().field_70136_U)**2) + + let verticleSpeed = this.player.getPlayer().field_70163_u-this.player.getPlayer().field_70137_T + + this.animOffset += Math.min(1, horisontalSpeed)*10*timeSince+1*timeSince + + let flapAmountMultiplyerNoEnd = 1 + let flapAmountMultiplyer = 1 + + let wingEndOffsetThing = 0 + + flapAmountMultiplyerNoEnd += Math.min(5, (horisontalSpeed*5)) + let flapMainOffsetThing = 0 + + let wingBackAmount = 0 + + if(this.player.getPlayer().field_70172_ad > 0){ //damage tick + this.animOffset += 5*timeSince + } + + + // if((this.player === Player &&this.player.getPlayer().field_71075_bZ.field_75100_b) || (this.player !== Player && Math.abs(verticleSpeed)<0.2 && !this.player.getPlayer().field_70122_E)){//playerCapabilities.isFlying + if((verticleSpeed>-0.2) && !this.player.getPlayer().field_70122_E){ //flying + + if(this.animOffset-this.lastFlapSound > 2*Math.PI){ + + let dist = Math.sqrt((Player.getX()-this.player.getX())**2+(Player.getY()-this.player.getY())**2+(Player.getZ()-this.player.getZ())**2)+1 + + World.playSound("mob.enderdragon.wings", (this.settings.scale*15)*Math.min(1, 50/(dist*dist)), 1) + this.lastFlapSound = this.animOffset-this.animOffset%(Math.PI*2) + } + + this.animOffset += 5*timeSince //flap in mid air + + flapAmountMultiplyer *= 1.75 //flap harder + + if(this.player === Player && Client.getMinecraft().field_71474_y.field_74320_O === 0){ + if(!this.parent.lessFirstPersonVisable.getValue()){ + flapAmountMultiplyerNoEnd += 0.4 + flapMainOffsetThing = 0.3 + } + }else{ + flapAmountMultiplyer *= 1.25 + flapAmountMultiplyer *= 0.9 + flapMainOffsetThing = 0.1 + wingEndOffsetThing+= -0.1 + } + + wingEndOffsetThing += -0.75 + + if(verticleSpeed > 0){ + this.animOffset += verticleSpeed*25*timeSince //flap when flying upwards + } + }else{ + if(this.lastFlapSound < this.animOffset-this.animOffset%(Math.PI*2)){ + this.lastFlapSound = this.animOffset-this.animOffset%(Math.PI*2) + } + } + if(verticleSpeed < -0.5){ + wingBackAmount = Math.min(1, (verticleSpeed+0.5)*-1.5) //lift wings back further ur falling + + this.animOffset += (verticleSpeed+0.5)*-3*timeSince + } + + GlStateManager.func_179094_E(); // pushMatrix + + if(this.player !== Player){ + Tessellator.translate( + (this.player.getPlayer().field_70142_S + (this.player.getPlayer().field_70165_t-this.player.getPlayer().field_70142_S) * ticks) - (Player.getPlayer().field_70142_S + (Player.getPlayer().field_70165_t-Player.getPlayer().field_70142_S) * ticks), + (this.player.getPlayer().field_70137_T + (this.player.getPlayer().field_70163_u-this.player.getPlayer().field_70137_T) * ticks) - (Player.getPlayer().field_70137_T + (Player.getPlayer().field_70163_u-Player.getPlayer().field_70137_T) * ticks), + (this.player.getPlayer().field_70136_U + (this.player.getPlayer().field_70161_v-this.player.getPlayer().field_70136_U) * ticks) - (Player.getPlayer().field_70136_U + (Player.getPlayer().field_70161_v-Player.getPlayer().field_70136_U) * ticks)) + } + + Client.getMinecraft().field_71446_o.func_110577_a(textures) //bind texture + + if(this.player.getPlayer().field_70154_o){ + rotation = this.player.getPlayer().field_70759_as+(this.player.getPlayer().field_70759_as-this.player.getPlayer().field_70758_at)*ticks + } + if(!this.player.getPlayer().func_70608_bn()){ //dont rotate when in bed + Tessellator.rotate((180-rotation),0,1,0) + + Tessellator.translate(0,1.2,0.1) + + if(this.player.getPlayer().func_70093_af()){ //isSneaking + Tessellator.translate(0, -0.125,0) + Tessellator.rotate(-20, 1,0,0) + if(this.player === Player && Client.getMinecraft().field_71474_y.field_74320_O === 0){}else{ + Tessellator.translate(0, -0.125,0) + } + } + + if(this.player === Player && Client.getMinecraft().field_71474_y.field_74320_O === 0){ + //Make wings less scuffed when in first person looking down/up + Tessellator.translate(0, 0.25, 0.003*(this.player.getPitch())) + } + } + + + //Higher = more elytra like + wing.field_78796_g = 0.25; //rotateAngleY + + let shouldStandingStillWingThing = false + + let changeStandingStillWingThing = 0 + + if(horisontalSpeed < 0.01){ + if(!((verticleSpeed>-0.2) && !this.player.getPlayer().field_70122_E)){ //not flying + let amt = (this.animOffset+Math.PI/2)%(20*Math.PI) + if(amt < 1*Math.PI){ + if(amt > 0.65*Math.PI && (2*Math.PI+this.animOffset)-this.lastFlapSound > 2*Math.PI){ + + let dist = Math.sqrt((Player.getX()-this.player.getX())**2+(Player.getY()-this.player.getY())**2+(Player.getZ()-this.player.getZ())**2)+1 + + World.playSound("mob.enderdragon.wings", (this.settings.scale*15)*Math.min(1, 50/(dist*dist)), 1) + this.lastFlapSound = 2*Math.PI+(this.animOffset)-this.animOffset%(Math.PI*2) + } + this.animOffset += 2*timeSince*Math.min(1,(amt/(1*Math.PI))*2) + + flapAmountMultiplyer += (amt/(1*Math.PI))/2 + }else if(amt < 2*Math.PI){ + this.animOffset += 2*timeSince*Math.min(1,(1-(amt/(1*Math.PI)-1))*2) + + flapAmountMultiplyer += (1-(amt/(1*Math.PI)-1))/2 + } + } + if(this.player.getPlayer().func_70093_af()){ //isSneaking + if(this.player.getPlayer().field_70125_A > 20){ + shouldStandingStillWingThing = true + Tessellator.translate(0, 0,0.1) + changeStandingStillWingThing = Math.max(0,this.player.getPlayer().field_70125_A/600) + } + } + } + + if(shouldStandingStillWingThing){ + wing.field_78796_g = 0.25+(changeStandingStillWingThing)*3 + } + + if(this.player.getPlayer().func_70608_bn()){ //player in bed + + try{ //try catch incase no bed at that location + let facing = World.getWorld().func_180495_p(this.player.getPlayer().field_71081_bT).func_177229_b(FACING).func_176736_b() //0-3 is S-W-N-E + + let rotation = 0 + switch(facing){ + case 0: + rotation = 180 + Tessellator.translate(0, 0,-0.5) + break + case 1: + rotation = 90 + Tessellator.translate(0.5, 0,0) + break + case 2: + rotation = 0 + Tessellator.translate(0, 0,0.5) + break + case 3: + rotation = 270 + Tessellator.translate(-0.5, 0,0) + break + } + // console.log(rotation) + // console.log(World.getBlockAt(this.player.getX(), this.player.getY(), this.player.getZ()).getState().func_177229_b(FACING)) + Tessellator.translate(0, 0.75-this.settings.scale*100,0) + Tessellator.rotate(rotation, 0, 1, 0) + + wing.field_78795_f = 0; //rotateAngleX + + wing.field_78808_h = (-0.5+Math.sin(this.animOffset/5)*0.1)*this.settings.scale*100; //rotateAngleZ + + + wingTip.field_78808_h = -2.20+Math.sin(this.animOffset/5)*0.1 + }catch(e){} + }else if(wingBackAmount === 0){ + //tilt + let wing_tilt_offset = -Math.min(0.8, horisontalSpeed*3) //When go faster tilt wing back so its in direction of wind + + + if(shouldStandingStillWingThing){ + wing_tilt_offset += (changeStandingStillWingThing)*4 + } + + wing.field_78795_f = 0.75 - Math.cos(this.animOffset) * 0.2+wing_tilt_offset; //rotateAngleX + + + let wing_goback_amount = 0.15/(Math.min(1, horisontalSpeed)*3+0.25) + let temp_wing_thing = 1 + + if(shouldStandingStillWingThing){ + wing_goback_amount /= 1+(changeStandingStillWingThing)/50 + flapAmountMultiplyer /= 1+(changeStandingStillWingThing)/50 + + temp_wing_thing += changeStandingStillWingThing*50 + } + + let temp_horis_wingthing = 0 + if(shouldStandingStillWingThing){ + temp_horis_wingthing = -(changeStandingStillWingThing)*0.75 + } + + wing.field_78808_h = (Math.sin(this.animOffset)/temp_wing_thing + 0.125) * wing_goback_amount*(1+(flapAmountMultiplyer-1)*1)*flapAmountMultiplyerNoEnd -0.4-wing_tilt_offset/3+temp_horis_wingthing+flapMainOffsetThing; //rotateAngleZ + + + wingTip.field_78808_h = -((Math.sin((this.animOffset+1.5+(1-temp_wing_thing)/8.5))/(1+(temp_wing_thing-1)/3) + 0.5)) * 0.75*(1+(flapAmountMultiplyer-1)*1)/(1+temp_horis_wingthing) - (1-flapAmountMultiplyer)*2-(1-temp_wing_thing)/10+wingEndOffsetThing; //rotateAngleZ + }else{ + //tilt + let wing_tilt_offset = -Math.min(0.8, horisontalSpeed*3) //When go faster tilt wing back so its in direction of wind + wing.field_78795_f = 0.75 - Math.cos(this.animOffset) * 0.2+wing_tilt_offset-wingBackAmount/2; //rotateAngleX + + + wing.field_78808_h = -wingBackAmount; //rotateAngleZ + + + wingTip.field_78808_h = -((Math.sin((this.animOffset))*0.5 + 0.3)) + } + + + Tessellator.translate(0.1, 0, 0) + wing.func_78791_b(this.settings.scale) //render left wing + + Tessellator.translate(-0.2, 0, 0) + Tessellator.scale(-1, 1, 1) + wing.func_78791_b(this.settings.scale) //render right wing + + + GlStateManager.func_179121_F(); // popMatrix + } + + onTick(){ + // this.scale += 0.001 + } +} + +export default DragonWings; + + +function getField(e, field){ + + let field2 = e.class.getDeclaredField(field); + + field2.setAccessible(true) + + return field2.get(e) +}
\ No newline at end of file diff --git a/features/cosmetics/hiddenRequirement.js b/features/cosmetics/hiddenRequirement.js new file mode 100644 index 0000000..7e0b57a --- /dev/null +++ b/features/cosmetics/hiddenRequirement.js @@ -0,0 +1,5 @@ +let cosmeticsClass = require("./index").class + +export default ()=>{ + return !!cosmeticsClass?.cosmeticsData?.[Player.getUUID().toString()] +}
\ No newline at end of file diff --git a/features/cosmetics/index.js b/features/cosmetics/index.js new file mode 100644 index 0000000..593ac7c --- /dev/null +++ b/features/cosmetics/index.js @@ -0,0 +1,146 @@ +/// <reference types="../../../CTAutocomplete" /> +/// <reference lib="es2015" /> +import Feature from "../../featureClass/class"; +import DragonWings from "./dragonWings" +import Toggle from "../settings/settingThings/toggle" + +class Cosmetics extends Feature { + constructor() { + super() + } + + onEnable(){ + this.initVariables() + this.loadedCosmetics = [] + this.uuidToCosmetic = {} + + this.cosmeticsData = {} + + this.firstPersonVisable = new Toggle("Cosmetics visable in first person", "", false, "cosmetics_first_person_visable", this) + this.lessFirstPersonVisable = new Toggle("Make cosmetics less visable in first person mode", "", true, "cosmetics_first_person_less_visable", this).requires(this.firstPersonVisable) + + this.loadCosmeticsData() + + this.worldLoad() + + this.registerEvent("tick", this.tick) + this.registerEvent("renderWorld", this.renderWorld) + this.registerEvent("playerJoined", this.playerJoined) + this.registerEvent("playerLeft", this.playerLeft) + this.registerEvent("worldLoad", this.worldLoad) + this.registerStep(false, 5, this.step) + this.registerStep(false, 60*10, ()=>{ + new Thread(()=>{this.loadCosmeticsData.call(this)}).start() + }) + } + + loadCosmeticsData(){ + let data = JSON.parse(FileLib.getUrlContent("http://soopymc.my.to/api/soopyv2/cosmetics.json")) + + this.cosmeticsData = data + + this.scanForNewCosmetics() + } + + step(){ + this.scanForNewCosmetics() + } + scanForNewCosmetics(){ + + if(!this.uuidToCosmetic[Player.getUUID().toString()] && this.shouldPlayerHaveCosmetic(Player, "dragon_wings")){ + let cosmetic = new DragonWings(Player, this) + this.loadedCosmetics.push(cosmetic) + this.uuidToCosmetic[Player.getUUID().toString()] = cosmetic + } + + World.getAllPlayers().forEach(p=>{ + if(p.getUUID().toString() === Player.getUUID().toString() || this.uuidToCosmetic[p.getUUID().toString()]) return + if(this.shouldPlayerHaveCosmetic(p, "dragon_wings")){ + let cosmetic = new DragonWings(p, this) + this.loadedCosmetics.push(cosmetic) + this.uuidToCosmetic[p.getUUID().toString()] = cosmetic + } + }) + } + + worldLoad(){ + this.loadedCosmetics = [] + this.uuidToCosmetic = {} + + if(this.shouldPlayerHaveCosmetic(Player, "dragon_wings") && !this.uuidToCosmetic[Player.getUUID().toString()]){ + let cosmetic = new DragonWings(Player, this) + this.loadedCosmetics.push(cosmetic) + this.uuidToCosmetic[Player.getUUID().toString()] = cosmetic + } + + World.getAllPlayers().forEach(p=>{ + if(p.getUUID().toString() === Player.getUUID().toString()) return + if(this.shouldPlayerHaveCosmetic(p, "dragon_wings") && !this.uuidToCosmetic[p.getUUID().toString()]){ + let cosmetic = new DragonWings(p, this) + this.loadedCosmetics.push(cosmetic) + this.uuidToCosmetic[p.getUUID().toString()] = cosmetic + } + }) + } + + playerJoined(player){ + if(player.getUUID().toString() === Player.getUUID().toString()) return + + if(this.shouldPlayerHaveCosmetic(player, "dragon_wings") && !this.uuidToCosmetic[player.getUUID().toString()]){ + let cosmetic = new DragonWings(player, this) + this.loadedCosmetics.push(cosmetic) + this.uuidToCosmetic[player.getUUID().toString()] = cosmetic + } + } + + playerLeft(playerName){ + this.loadedCosmetics.filter(cosmetic=>{ + if(cosmetic.player.getName() === playerName){ + this.uuidToCosmetic[cosmetic.player.getUUID().toString()] = undefined + return false + } + return true + }) + } + + shouldPlayerHaveCosmetic(player, cosmetic){ + return !!this.cosmeticsData[player.getUUID().toString()]?.[cosmetic] + } + getPlayerCosmeticSettings(player, cosmetic){ + return this.cosmeticsData[player.getUUID().toString()]?.[cosmetic] + } + + filterUnloadedCosmetics(tick){ + this.loadedCosmetics = this.loadedCosmetics.filter(cosmetic => { + if(tick) cosmetic.onTick() + if(cosmetic.player.getPlayer().field_70128_L){ //filter out players that are no longer loaded + this.uuidToCosmetic[cosmetic.player.getUUID().toString()] = undefined + return false + } + return true + }) + } + + tick(){ + this.filterUnloadedCosmetics(true) + } + + renderWorld(ticks){ + this.loadedCosmetics.forEach(cosmetic => { + cosmetic.onRender(ticks) + }) + } + + initVariables(){ + this.loadedCosmetics = undefined + this.uuidToCosmetic = undefined + } + + onDisable(){ + this.initVariables() + } +} + +module.exports = { + class: new Cosmetics() +}
\ No newline at end of file diff --git a/features/cosmetics/metadata.json b/features/cosmetics/metadata.json new file mode 100644 index 0000000..f198cff --- /dev/null +++ b/features/cosmetics/metadata.json @@ -0,0 +1,8 @@ +{ + "name": "Cosmetics", + "description": "Cosmetics settings", + "isTogglable": false, + "defaultEnabled": true, + "isHidden": "hiddenRequirement.js", + "sortA": 1 +}
\ No newline at end of file diff --git a/features/globalSettings/index.js b/features/globalSettings/index.js index 5b459f9..422754f 100644 --- a/features/globalSettings/index.js +++ b/features/globalSettings/index.js @@ -3,6 +3,7 @@ import Feature from "../../featureClass/class"; import ButtonSetting from "../settings/settingThings/button"; import TextSetting from "../settings/settingThings/textSetting"; +import ToggleSetting from "../settings/settingThings/toggle"; class Hud extends Feature { constructor() { @@ -20,6 +21,8 @@ class Hud extends Feature { this.apiKeySetting = new TextSetting("Api Key", "Your hypixel api key", "", "api_key", this, "Run /api new to load", true) this.verifyApiKey = new ButtonSetting("Verify api key", "Click this to make sure the api key is working", "verify_key", this, "Click!", this.verifyKey, undefined) + this.notifyNewVersion = new ToggleSetting("Notify when there is a new update", "Will notify you when there is a new version of soopyv2 avalible for download", true, "notify_update", this) //TODO: Make false by default when uploaded on ct website + this.registerChat("&aYour new API key is &r&b${key}&r", this.newKey) } diff --git a/features/soopyGui/index.js b/features/soopyGui/index.js index 428bbf1..7248e12 100644 --- a/features/soopyGui/index.js +++ b/features/soopyGui/index.js @@ -32,7 +32,7 @@ class SoopyGui extends Feature { // this.gui.isDebugEnabled = true - this.gui.setOpenCommand("soopyv2") + this.registerCommand("soopyv2", this.openCommand) this.mainWindowElement = new SoopyBoxElement().setLocation(0.25, 0.2, 0.5, 0.6) @@ -70,6 +70,18 @@ class SoopyGui extends Feature { this.updateButtons() } + openCommand(page){ + this.gui.open() + + if(page){ + this.pages.forEach(p=>{ + if(p.name.toLowerCase() === page.toLowerCase()){ + this.clickedOpen(p) + } + }) + } + } + addCategory(category){ this.pages.push(category) this.sortPages() @@ -3,7 +3,7 @@ class Logger{ constructor(){ - this.loglevel = 4 //0=none, 1=error, 2=warn, 3=info, 4=debug + this.loglevel = isDev()?4:2 //0=none, 1=error, 2=warn, 3=info, 4=debug this.logToMcChat = false this.logPrefixes = [ "[SOOPYADDONS] ", @@ -25,4 +25,10 @@ class Logger{ } } +let devs = ["dc8c39647b294e03ae9ed13ebd65dd29"] + +function isDev(){ + return devs.includes(Player.getUUID().toString().replace(/-/g, "")) +} + export default new Logger()
\ No newline at end of file diff --git a/metadata.json b/metadata.json index 739b19b..6552e03 100644 --- a/metadata.json +++ b/metadata.json @@ -5,8 +5,8 @@ "entry": "index.js", "description": "Soopy addons v2", "name": "SoopyV2", - "version": "2.0.1", - "versionId": 111, + "version": "2.0.2", + "versionId": 112, "requires": [ "soopyApis", "soopyAddonsData", diff --git a/utils/utils.js b/utils/utils.js index b8569d9..8aa2ad0 100644 --- a/utils/utils.js +++ b/utils/utils.js @@ -1,7 +1,7 @@ const NBTTagList = Java.type('net.minecraft.nbt.NBTTagList'); const NBTTagString = Java.type('net.minecraft.nbt.NBTTagString'); -let functions = { +let utils = { addLore: function(item, prefix, value){ const list = item @@ -30,6 +30,9 @@ let functions = { .getRawNBT() .func_74782_a("Lore", list); }, + getSBID: function(item){ + return item.getNBT()?.getCompoundTag("tag")?.getCompoundTag("ExtraAttributes")?.getString("id") || null + }, calculateDistance: function(p1, p2) { var a = p2[0] - p1[0]; var b = p2[1] - p1[1]; @@ -113,4 +116,4 @@ let functions = { } } -module.exports = functions
\ No newline at end of file +export default utils
\ No newline at end of file |