/// /// import Feature from "../../featureClass/class"; import { f } from "../../../mappings/mappings"; import { drawBoxAtBlock, drawBoxAtBlockNotVisThruWalls, drawLine } from "../../utils/renderUtils"; import { calculateDistance, calculateDistanceQuick, fastestPathThrough } from "../../utils/utils"; import HudTextElement from "../hud/HudTextElement"; import LocationSetting from "../settings/settingThings/location"; import ToggleSetting from "../settings/settingThings/toggle"; class Events extends Feature { constructor() { super() } onEnable(){ this.initVariables() this.burrialData = { points: [], locations: [], historicalLocations: [] } this.lastRequestTime = 0 this.nextUpdateApprox = -1 this.lastWorldChange = 0 this.lastRequest = 0 this.potentialParticleLocs = {} this.showingWaypoints = false this.lastPath = [] this.updatingPath = false this.hudElements = [] this.lastPathCords = undefined this.burrialWaypointsEnabled = new ToggleSetting("Burrial waypoints", "Show waypoints for burrials during the diana event", true, "burrial_waypoints", this) this.burrialWaypointsPath = new ToggleSetting("Pathfind waypoints", "Calculate a path thru all the waypoints", true, "burrial_waypoints_path", this).requires(this.burrialWaypointsEnabled) this.burrialWaypointsNearest = new ToggleSetting("Show nearest using pathfinding", "Use pathfinding to highlight the next burrial instead of disance", true, "burrial_nearest_path", this).requires(this.burrialWaypointsEnabled) this.updateTimerEnabled = new ToggleSetting("Show API update timer", "Shows a countdown till the burrial waypoints will be next updated", true, "burrial_timer", this).requires(this.burrialWaypointsEnabled) this.updateTimer = new HudTextElement() .setToggleSetting(this.updateTimerEnabled) .setLocationSetting(new LocationSetting("Timer Location", "Allows you to edit the location of the timer", "burrial_timer_location", this, [10, 50, 1, 1]) .requires(this.burrialWaypointsEnabled) .editTempText("&6Update&7> &f100s")) this.hudElements.push(this.updateTimer) this.shinyBlocks = [] this.shinyBlockOverlayEnabled = new ToggleSetting("Shiny blocks highlight", "Will highlight shiny blocks in the end", false, "shiny_blocks_overlay", this) this.registerEvent("worldLoad", this.worldLoad) this.registerEvent("spawnParticle", this.spawnParticle) this.registerEvent("renderWorld", this.renderWorld) this.registerEvent("renderOverlay", this.renderOverlay) this.registerEvent("blockBreak", this.blockBreak) this.registerStep(true, 2, this.step) this.registerStep(false, 5, this.step_5s) this.registerSoopy("apiLoad", this.apiLoad) this.registerChat("&r&eYou dug out a Griffin Burrow! &r&7(${*}/4)&r", this.burrialClicked) this.registerChat("&r&eYou finished the Griffin burrow chain! &r&7(4/4)&r", this.burrialClicked) } renderOverlay(){ for(let element of this.hudElements){ element.render() } } renderWorld(ticks){ this.shinyBlocks.forEach(([loc])=>{ drawBoxAtBlockNotVisThruWalls(loc[0], loc[1], loc[2], 0,255,0,0.1,0.1) }) if(this.showingWaypoints && this.lastPathCords && this.burrialWaypointsPath.getValue()){ let startPoint = [Player.getPlayer()[f.lastTickPosX]+Player.getPlayer()[f.motionX.Entity]*ticks, Player.getPlayer()[f.lastTickPosY]+Player.getPlayer()[f.motionY.Entity]*ticks, Player.getPlayer()[f.lastTickPosZ]+Player.getPlayer()[f.motionZ.Entity]*ticks] let lastPoint = startPoint || [0,0,0] this.lastPathCords.forEach((point)=>{ drawLine(...lastPoint,...point,255,255,0) lastPoint = point }) } if(this.showingWaypoints){ this.burrialData.locations.forEach((loc,i)=>{ let typeReplace = [ "Start", "Mob", "Treasure", "Finish", "Unknown" ] if(!loc.clicked){ blue = false if(loc.lastPing && Date.now()-loc.lastPing < 500){ blue = true } drawBoxAtBlock(loc.x, loc.y,loc.z,0,blue?100:255,blue?255:0) } if(loc.fromApi){ Tessellator.drawString( "(" + (loc.chain+1) + "/4) " + typeReplace[loc.type] + " BURRIAL (" + Math.round(calculateDistance([Player.getX(),Player.getY(),Player.getZ()],[loc.x+0.5,loc.y+2.5,loc.z+0.5])) + "m)", loc.x+0.5, loc.y+1.5, loc.z+0.5, loc.clicked? 65280:(loc.nearest?16711680:6579300), true, loc.clicked? 0.04:(loc.nearest?1:0.5), !loc.clicked ); }else{ Tessellator.drawString( typeReplace[loc.type] + " BURRIAL (" + Math.round(calculateDistance([Player.getX(),Player.getY(),Player.getZ()],[loc.x+0.5,loc.y+2.5,loc.z+0.5])) + "m)", loc.x+0.5, loc.y+1.5, loc.z+0.5, loc.clicked? 65280:(loc.nearest?16711680:6579300), true, loc.clicked? 0.04:(loc.nearest?1:0.5), !loc.clicked ); } }) } } sortBurrialLocations(){ let sorted = [...this.burrialData.locations] sorted.sort((a,b)=>{ let aDist = calculateDistanceQuick([Player.getX(),Player.getY(),Player.getZ()],[a.x+0.5,a.y+2.5,a.z+0.5]) let bDist = calculateDistanceQuick([Player.getX(),Player.getY(),Player.getZ()],[b.x+0.5,b.y+2.5,b.z+0.5]) return bDist-aDist }) this.burrialData.locations = sorted } step(){ if(!Player.getInventory()) return hasDianaShovle = false let slots = [0, 1, 2, 3, 4, 5, 6, 7, 8] slots.forEach(a=>{ item = Player.getInventory().getStackInSlot(a) if(!item) return if(ChatLib.removeFormatting(item.getName()) === "Ancestral Spade"){ hasDianaShovle = true } }) let showingWaypointsNew = (this.lastWorldChange+5000 0 && this.nextUpdateApprox > 0 && Date.now()-this.lastRequest>5000){ this.nextUpdateApprox = -2 this.loadApi() } } this.showingWaypoints = showingWaypointsNew if(this.showingWaypoints){ this.updateTimer.setText("&6Update&7> &f" + (this.nextUpdateApprox===-1?"Updating...":(this.nextUpdateApprox===-2?"Loading...":Math.ceil((this.nextUpdateApprox-Date.now())/1000) + "s"))) }else{ this.updateTimer.setText("") } this.shinyBlocks = this.shinyBlocks.filter(([loc, time])=>{ return time > Date.now()-5000 }) } step_5s(){ if(this.showingWaypoints){ if(this.burrialWaypointsPath.getValue() || this.burrialWaypointsNearest.getValue()){ new Thread(()=>{ this.updateBurrialPath() }).start() } } this.sortBurrialLocations() } worldLoad(){ this.burrialData.points = [] this.burrialData.locations = [] this.burrialData.historicalLocations = [] this.nextUpdateApprox = Date.now() this.lastWorldChange = Date.now() } loadApi(){ new Thread(()=>{ this.FeatureManager.features["dataLoader"].class.loadApiData("skyblock", false) }).start() } apiLoad(data, dataType, isSoopyServer, isLatest){ if(!this.showingWaypoints) return; if(isSoopyServer || dataType !== "skyblock" || !isLatest) return this.lastRequest = Date.now() let profileData = data.profiles[0].members[Player.getUUID().toString().replace(/-/g,"")] data.profiles.forEach((prof)=>{ if((prof.members[Player.getUUID().toString().replace(/-/g,"")].last_save || 0) > (profileData.last_save || 0)){ profileData = prof.members[Player.getUUID().toString().replace(/-/g,"")] } }) this.nextUpdateApprox = profileData.last_save+173000 this.nextUpdateApprox += 2000 //incase ur pc time is behind if(profileData.last_save === this.lastRequestTime){ return } this.lastRequestTime = profileData.last_save let locsAccessed = [] let newLocs = [] profileData.griffin.burrows.forEach((burrow)=>{ let pushed = false this.burrialData.locations.forEach((loc, i)=>{ if((loc.fromApi || loc.clicked) && loc.x + "," + loc.y + "," + loc.z === burrow.x + "," + burrow.y + "," + burrow.z){ newLocs.push(loc) pushed = true locsAccessed.push(i) } }) this.burrialData.historicalLocations.forEach((loc)=>{ if(loc.x + "," + loc.y + "," + loc.z === burrow.x + "," + burrow.y + "," + burrow.z){ pushed = true } }) if(!pushed){ burrow.clicked = false burrow.fromApi = true newLocs.push(burrow) } }) this.burrialData.locations.forEach((loc)=>{ if(!loc.fromApi){ let found = false newLocs.forEach((burrow)=>{ if(loc.x + "," + loc.y + "," + loc.z === burrow.x + "," + burrow.y + "," + burrow.z){ found = true } }) if(!found){ newLocs.push(loc) } } }) this.burrialData.locations = newLocs this.sortBurrialLocations() this.updateBurrialPath() } spawnParticle(particle, type, event){ if(this.shinyBlockOverlayEnabled.getValue()){ if(particle.toString().startsWith("EntitySpellParticleFX,")){ if(particle.getUnderlyingEntity().func_70534_d()===particle.getUnderlyingEntity().func_70535_g()){ let arr = [particle.getX(), particle.getY(), particle.getZ()] if(arr.map(a=>Math.abs(a%1)).includes(0.25) || arr.map(a=>Math.abs(a%1)).includes(0.75)){ this.shinyBlocks.push([[particle.getX(), particle.getY(), particle.getZ()], Date.now()]) } } } } if(this.showingWaypoints){ let foundEnchant = false let foundCrit = false let foundStep = false let isMob = undefined if(particle.toString().startsWith('EntityEnchantmentTableParticleFX, ')){ foundEnchant = true } else if(particle.toString().startsWith('EntityCrit2FX, ')){ foundCrit = true isMob = particle.getUnderlyingEntity().func_70534_d() > 0.5 //mob) } else if(particle.toString().startsWith('EntityFootStepFX, ')){ foundStep = true } else if(particle.toString().startsWith('EntityCritFX, ')){ let locstr = Math.floor(particle.getX()) + "," + Math.floor(particle.getY()-1) + "," + Math.floor(particle.getZ()) let removed = false this.burrialData.locations.filter((loc, i)=>{ if(!loc.clicked && loc.x + "," + loc.y + "," + loc.z === locstr){ loc.clicked = true removed = true this.lastPathCords.shift() } }) if(!removed) return; this.burrialData.locations = this.burrialData.locations.filter(a=>{ if(!a.clicked) return true if(calculateDistanceQuick([a.x,a.y,a.z],[Player.getX(),Player.getY(),Player.getZ()]) < 15*15) return true; this.burrialData.historicalLocations.unshift(a) return false }) if(this.burrialData.historicalLocations.length > 10) this.burrialData.historicalLocations.pop() return; } if(!foundEnchant && !foundCrit && !foundStep) return; let locstr = Math.floor(particle.getX()) + "," + Math.floor(particle.getY()-1) + "," + Math.floor(particle.getZ()) let locarr = [Math.floor(particle.getX()), Math.floor(particle.getY()-1), Math.floor(particle.getZ())] let found = false this.burrialData.locations.forEach((loc)=>{ if(loc.x + "," + loc.y + "," + loc.z === locstr){ found = true loc.lastPing = Date.now() } if((loc.x+1) + "," + loc.y + "," + loc.z === locstr){ found = true loc.lastPing = Date.now() } if((loc.x-1) + "," + loc.y + "," + loc.z === locstr){ found = true loc.lastPing = Date.now() } if(loc.x + "," + loc.y + "," + (loc.z+1) === locstr){ found = true loc.lastPing = Date.now() } if(loc.x + "," + loc.y + "," + (loc.z-1) === locstr){ found = true loc.lastPing = Date.now() } }) if(this.burrialData.historicalLocations){ this.burrialData.historicalLocations.forEach((loc)=>{ if(loc.x + "," + loc.y + "," + loc.z === locstr){ found = true } }) } if(found) return; if (!this.potentialParticleLocs[locstr])this.potentialParticleLocs[locstr] = {enchant: 0, crit: 0, step: 0, isMob: 0, timestamp: Date.now()} if(foundEnchant) this.potentialParticleLocs[locstr].enchant++ if(foundCrit) this.potentialParticleLocs[locstr].crit++ if(foundStep) this.potentialParticleLocs[locstr].step++ if(foundCrit && isMob) this.potentialParticleLocs[locstr].isMob++ if(foundCrit && !isMob) this.potentialParticleLocs[locstr].isMob-- this.potentialParticleLocs[locstr].timestamp = Date.now() if(this.potentialParticleLocs[locstr].enchant > 2 && this.potentialParticleLocs[locstr].step > 5){ this.burrialData.locations.push({ "x": locarr[0], "y": locarr[1], "z": locarr[2], "type": this.potentialParticleLocs[locstr].isMob > 1? 1:(this.potentialParticleLocs[locstr].crit > this.potentialParticleLocs[locstr].enchant/20?0:2), "tier": -1, "chain": -1, "fromApi": false }) new Thread(()=>{ this.updateBurrialPath() }).start() } } } burrialClicked(){ if(!this.showingWaypoints) return let nearestBurriali = undefined let nearestBurrialDist = Infinity this.burrialData.locations.forEach((loc, i)=>{ let dist = calculateDistanceQuick([loc.x, loc.y, loc.z], [Player.getX(), Player.getY(), Player.getZ()]) if(dist < nearestBurrialDist){ nearestBurrialDist = dist nearestBurriali = i } }) if(nearestBurriali === undefined) return; this.burrialData.locations[nearestBurriali].clicked = true this.burrialData.locations = this.burrialData.locations.filter(a=>{ if(!a.clicked) return true if(calculateDistanceQuick([a.x,a.y,a.z],[Player.getX(),Player.getY(),Player.getZ()]) < 15*15) return true; this.burrialData.historicalLocations.unshift(a) return false }) if(this.burrialData.historicalLocations.length > 10) this.burrialData.historicalLocations.pop() if(this.lastPathCords) this.lastPathCords.shift() new Thread(()=>{ this.updateBurrialPath() }).start() } updateBurrialPath(){ if(this.burrialWaypointsPath.getValue() || this.burrialWaypointsNearest.getValue()){ let startPoint = [Player.getX(),Player.getY(),Player.getZ()] let points = this.burrialData.locations.filter((a)=>{return !a.clicked}).map((a)=>{return [a.x+0.5,a.y+1.3,a.z+0.5]}) if(points.length !== 0){ if(points.length >= 10){ this.lastPath = undefined this.lastPathCords = undefined }else{ this.lastPath = fastestPathThrough(startPoint,points) this.lastPathCords = [] this.lastPath.forEach(a=>{ this.lastPathCords.push(points[a]) }) } if(this.lastPath.length === 0){ this.lastPath = undefined this.lastPathCords = undefined } }else{ this.lastPath = undefined this.lastPathCords = undefined } } if(this.showingWaypoints){ if(this.burrialWaypointsNearest.getValue()){ let trueI = 0 this.burrialData.locations.forEach((loc,i)=>{ if(!loc.clicked && trueI === this.lastPath[0]){ this.burrialData.locations[i].nearest = true }else{ this.burrialData.locations[i].nearest = false } if(!loc.clicked) trueI++ }) }else{ let closestBurrialI = 0 let closestBurrialDist = Infinity this.burrialData.locations.forEach((loc,i)=>{ let dist = calculateDistanceQuick([loc.x,loc.y,loc.z],[Player.getX(),Player.getY(),Player.getZ()]) if(dist < closestBurrialDist){ closestBurrialDist = dist closestBurrialI = i } this.burrialData.locations[i].nearest = false }) this.burrialData.locations[closestBurrialI].nearest = true } } } initVariables(){ this.burrialData = undefined this.lastRequestTime = undefined this.nextUpdateApprox = undefined this.lastRequest = undefined this.potentialParticleLocs = undefined this.showingWaypoints = undefined this.lastPath = undefined this.updatingPath = undefined this.hudElements = undefined this.lastPathCords = undefined } onDisable(){ this.initVariables() } } module.exports = { class: new Events() }