aboutsummaryrefslogtreecommitdiff
path: root/features/slayers/index.js
diff options
context:
space:
mode:
authorSoopyboo32 <49228220+Soopyboo32@users.noreply.github.com>2021-10-31 09:49:42 +0800
committerSoopyboo32 <49228220+Soopyboo32@users.noreply.github.com>2021-10-31 09:49:42 +0800
commit48653ec89538f1650106a5e77463412cad4684c2 (patch)
tree09687cd579462e04d539fd4615369fa6dae13902 /features/slayers/index.js
downloadSoopyV2-48653ec89538f1650106a5e77463412cad4684c2.tar.gz
SoopyV2-48653ec89538f1650106a5e77463412cad4684c2.tar.bz2
SoopyV2-48653ec89538f1650106a5e77463412cad4684c2.zip
first commit
Diffstat (limited to 'features/slayers/index.js')
-rw-r--r--features/slayers/index.js359
1 files changed, 359 insertions, 0 deletions
diff --git a/features/slayers/index.js b/features/slayers/index.js
new file mode 100644
index 0000000..3599996
--- /dev/null
+++ b/features/slayers/index.js
@@ -0,0 +1,359 @@
+/// <reference types="../../../CTAutocomplete" />
+/// <reference lib="es2015" />
+import Feature from "../../featureClass/class";
+import { numberWithCommas } from "../../utils/numberUtils";
+import { drawBoxAtBlock, drawBoxAtEntity, drawFilledBox, drawLine } from "../../utils/renderUtils";
+import HudTextElement from "../hud/HudTextElement";
+import LocationSetting from "../settings/settingThings/location";
+import ToggleSetting from "../settings/settingThings/toggle";
+
+class Slayers extends Feature {
+ constructor() {
+ super()
+ }
+
+ onEnable(){
+ this.initVariables()
+
+ this.expOnKill = new ToggleSetting("Show slayer exp on boss kill", "Says your slayer exp in chat when you kill a boss", true, "slayer_xp", this)
+ this.slainAlert = new ToggleSetting("Show boss slain alert", "This helps you to not kill mobs for ages with an inactive quest", true, "boss_slain_alert", this)
+ this.spawnAlert = new ToggleSetting("Show boss spawned alert", "This helps you to not miss your boss when you spawn it", true, "boss_spawn_alert", this)
+
+
+ this.boxAroundEmanBoss = new ToggleSetting("Box around enderman slayer boss", "This helps to know what boss it yours", true, "eman_box", this)
+ this.boxToEmanBeacon = new ToggleSetting("Box and line to the enderman beacon", "This will help to find the beacon when the boss throws it", true, "eman_beacon", this)
+ this.emanBeaconDinkDonk = new ToggleSetting("DinkDonk when beacon is spawned", "This will help to notice when the beacon is spawned", true, "eman_beacon_dinkdink", this)
+ this.emanEyeThings = new ToggleSetting("Put box around the enderman eye things", "This will help to find them", true, "eman_eye_thing", this)
+ this.emanHpGuiElement = new ToggleSetting("Render the enderman hp on your screen", "This will help you to know what stage u are in ect", true, "eman_hp", this)
+
+ this.emanHpElement = new HudTextElement()
+ .setToggleSetting(this.emanHpGuiElement)
+ .setLocationSetting(new LocationSetting("Eman Hp Location", "Allows you to edit the location of the enderman hp", "eman_location", this, [10, 50, 1, 1])
+ .requires(this.emanHpGuiElement)
+ .editTempText("&6Enderman&7> &f&l30 Hits"))
+ this.hudElements.push(this.emanHpElement)
+
+ this.slayerExp = {}
+ this.slayerExpLoaded = false
+
+ this.lastSlayerType = ""
+ this.lastSlayerExp = 0
+ this.registerChat("&r &r&a&lSLAYER QUEST COMPLETE!&r",(e)=>{
+ this.slayerExp[this.lastSlayerType] = this.lastSlayerExp + (this.slayerExp[this.lastSlayerType] || 0)
+ if(this.expOnKill.getValue()){
+ cancel(e)
+ ChatLib.chat("&r &r&a&lSLAYER QUEST COMPLETE!&r")
+ ChatLib.chat("&r &r&aYou have &d" + numberWithCommas(this.slayerExp[this.lastSlayerType]) + " " + this.lastSlayerType + " XP&r&7!&r")
+ ChatLib.chat("&r &r&aYou have &d" + numberWithCommas(Object.values(this.slayerExp).reduce((a, t)=>t+a, 0)) + " total XP&r&7!&r")
+ }
+ })
+
+ this.bossSlainMessage = false
+ this.bossSpawnedMessage = false
+ this.lastBossNotSpawnedTime = 0
+
+ this.registerEvent("renderOverlay", this.renderOverlay)
+
+
+ this.registerSoopy("apiLoad", this.apiLoad)
+ if(this.FeatureManager.features["dataLoader"].class.lastApiData.skyblock){
+ this.apiLoad(this.FeatureManager.features["dataLoader"].class.lastApiData.skyblock, "skyblock", true, true)
+ }
+
+ this.todoE = []
+ this.beaconPoints = {}
+ this.beaconE = []
+ this.deadE = []
+ this.beaconLocations = {}
+ this.eyeE = []
+ this.todoE2 = []
+ this.emanBoss = undefined
+ this.nextIsBoss = 0
+
+ this.registerForge(net.minecraftforge.event.entity.EntityJoinWorldEvent, this.entityJoinWorldEvent)
+ this.registerForge(net.minecraftforge.event.entity.living.LivingAttackEvent, this.entityAttackEvent) //TODO: Use CT event when ct 2.0 because they fixed
+ this.registerEvent("tick", this.tick)
+ this.registerEvent("renderWorld", this.renderWorld)
+ this.registerEvent("worldLoad", this.worldLoad)
+ this.registerEvent("renderOverlay", this.renderHud)
+ }
+
+ renderHud(){
+ for(let element of this.hudElements){
+ element.render()
+ }
+ }
+
+ worldLoad(){
+ this.todoE = []
+ this.beaconPoints = {}
+ this.beaconE = []
+ this.deadE = []
+ this.todoE2 = []
+ this.beaconLocations = {}
+ this.eyeE = []
+ this.emanBoss = undefined
+ }
+
+ entityAttackEvent(event){
+ if(event.source.func_76346_g() === Player.getPlayer()){
+ if(event.entity instanceof net.minecraft.entity.monster.EntityEnderman){
+ World.getAllEntitiesOfType(net.minecraft.entity.item.EntityArmorStand).forEach(e=>{
+ if(e.getName().includes("Voidgloom Seraph")){
+ //if distance from e to event.entity < 5
+ if((e.getX() - event.entity.field_70165_t)**2 + (e.getY() - event.entity.field_70163_u)**2 + (e.getZ() - event.entity.field_70161_v)**2 < 25){
+ this.emanBoss = e
+ }
+ }
+ })
+ }
+ }
+ }
+
+ renderWorld(ticks){
+ Object.values(this.beaconPoints).forEach(line=>{
+ let lastPoint = undefined
+ line.forEach(p=>{
+ if(lastPoint){
+ drawLine(lastPoint[0], lastPoint[1], lastPoint[2], p[0], p[1], p[2], 0, 0, 255, 3)
+ }
+ lastPoint = p
+ })
+ })
+
+ this.eyeE.forEach(e=>{
+ let x = e.getX() + ((e.getX()-e.getLastX())*ticks)
+ let y = e.getY() + ((e.getY()-e.getLastY())*ticks)
+ let z = e.getZ() + ((e.getZ()-e.getLastZ())*ticks)
+
+ drawBoxAtBlock(x-0.5, y+0.7, z-0.5, 255, 0, 0)
+ })
+
+ if(this.emanBoss) drawBoxAtEntity(this.emanBoss, 0, 255, 0, 1, -3, ticks, 4, false)
+
+ Object.values(this.beaconLocations).forEach(loc=>{
+ drawFilledBox(loc[0]+0.5, loc[1], loc[2]+0.5, 1.01, 1.01, 0, 0, 1, 1, true)
+ })
+ }
+
+ entityJoinWorldEvent(event){
+ this.todoE2.push(event.entity)
+ }
+
+ tick(){
+ this.bossSlainMessage = false
+ let dis1 = false
+ Scoreboard.getLines().forEach((line, i) => {
+ if(ChatLib.removeFormatting(line.getName()).includes("Slayer Quest")){
+ let slayerInfo = ChatLib.removeFormatting(Scoreboard.getLines()[i-1].getName().replace(/§/g,"&"))
+ let levelString = slayerInfo.split(" ").pop().trim()
+ let slayerLevelToExp = {
+ "I": 5,
+ "II": 25,
+ "III": 100,
+ "IV": 500,
+ "V": 1500
+ }
+ this.lastSlayerExp = slayerLevelToExp[levelString]
+ let slayerStrToType = {
+ "revenant": "zombie",
+ "tarantula": "spider",
+ "sven": "wolf",
+ "voidgloom":"enderman"
+ }
+ this.lastSlayerType = slayerStrToType[slayerInfo.split(" ")[0].toLowerCase()]
+ //slayerExp[lastSlayerType] += lastSlayerExp
+ }
+ if (line.getName().includes('Boss slain!')) {
+ this.bossSlainMessage = true
+ }
+
+ if (line.getName().includes('Slay the boss!')) {
+
+ if(!this.bossSpawnedMessage && !this.emanBoss){
+ this.nextIsBoss = Date.now()
+ }
+
+ dis1 = true
+ this.bossSpawnedMessage = true
+ }
+ })
+ if (!dis1) {
+ this.lastBossNotSpawnedTime = Date.now()
+ this.bossSpawnedMessage = false
+ }
+
+
+ this.todoE.forEach(e=>{
+ try{
+ if(e instanceof net.minecraft.entity.item.EntityArmorStand && e.func_71124_b(4)){
+ if(e.func_71124_b(4).func_82833_r() === "Beacon"){
+
+ let closestEIsGaming = false
+ let closestDist = Infinity
+ World.getAllEntitiesOfType(net.minecraft.entity.item.EntityArmorStand).forEach(e2=>{
+ if(e2.getName().includes("Voidgloom Seraph")){
+ if((e2.getX() - e.field_70165_t)**2 + (e2.getY() - e.field_70163_u)**2 + (e2.getZ() - e.field_70161_v)**2 < closestDist){
+ closestDist = (e2.getX() - e.field_70165_t)**2 + (e2.getY() - e.field_70163_u)**2 + (e2.getZ() - e.field_70161_v)**2
+ closestEIsGaming = this.emanBoss?e2.getUUID().toString()===this.emanBoss.getUUID().toString():false
+ }
+ }
+ })
+ if(closestEIsGaming){
+ this.beaconE.push(e)
+ }
+ }
+ if(e.func_71124_b(4).func_82833_r().startsWith("§a")){
+
+ let closestEIsGaming = false
+ let closestDist = Infinity
+ World.getAllEntitiesOfType(net.minecraft.entity.item.EntityArmorStand).forEach(e2=>{
+ if(e2.getName().includes("Voidgloom Seraph")){
+ if((e2.getX() - e.field_70165_t)**2 + (e2.getY() - e.field_70163_u)**2 + (e2.getZ() - e.field_70161_v)**2 < closestDist){
+ closestDist = (e2.getX() - e.field_70165_t)**2 + (e2.getY() - e.field_70163_u)**2 + (e2.getZ() - e.field_70161_v)**2
+ closestEIsGaming = this.emanBoss?e2.getUUID().toString()===this.emanBoss.getUUID().toString():false
+ }
+ }
+ })
+
+ if(closestEIsGaming && new Item(e.func_71124_b(4)).getNBT().getCompoundTag("tag").getCompoundTag("SkullOwner").getCompoundTag("Properties").getRawNBT().func_150295_c("textures", 10).func_150305_b(0).func_74779_i("Value") === "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0="){
+ this.eyeE.push(new Entity(e))
+ }
+ // console.log(":" + new Item(e.func_71124_b(4)).getNBT().getCompoundTag("tag").getCompoundTag("SkullOwner").getCompoundTag("Properties").getRawNBT().func_150295_c("textures", 10).func_150305_b(0).func_74779_i("Value"))
+ }
+ }
+
+ if(e.func_95999_t() && e.func_95999_t().includes("Voidgloom Seraph")){
+ if(Date.now()-this.nextIsBoss < 3000){
+ this.emanBoss = new Entity(e)
+ this.nextIsBoss = false
+ }
+ }
+ }catch(_){console.log(JSON.stringify(_, undefined, 2))}
+ })
+ this.todoE = this.todoE2
+ this.todoE2 = []
+
+ if(this.emanBoss && this.emanBoss.getEntity().field_70128_L) this.emanBoss = undefined
+ this.eyeE = this.eyeE.filter(e=>!e.getEntity().field_70128_L)
+ this.beaconE = this.beaconE.filter((e)=>{
+ if(e.field_70128_L){
+ this.deadE.push([Date.now(), e.func_110124_au().toString()])
+
+ let pos = [e.field_70165_t+0.5, e.field_70163_u+0.7, e.field_70161_v+0.5]
+ //check for a beacon block within 5 blocks of pos
+ for(let x = pos[0] - 5; x <= pos[0] + 5; x++){
+ for(let y = pos[1] - 5; y <= pos[1] + 5; y++){
+ for(let z = pos[2] - 5; z <= pos[2] + 5; z++){
+ if(World.getBlockAt(Math.floor(x), Math.floor(y), Math.floor(z)).getID() === 138){
+ this.beaconLocations[e.func_110124_au().toString()] = [Math.floor(x), Math.floor(y), Math.floor(z)]
+ }
+ }
+ }
+ }
+
+ // if(!this.beaconLocations[e.func_110124_au().toString()]){
+ // console.log("Diddnt find beacon wtf?????")
+ // }
+
+ return false
+ }
+ return true
+ })
+
+ this.beaconE.forEach((e)=>{
+ if(!this.beaconPoints[e.func_110124_au().toString()])this.beaconPoints[e.func_110124_au().toString()] = []
+
+ this.beaconPoints[e.func_110124_au().toString()].push([e.field_70165_t+0.5, e.field_70163_u+0.7, e.field_70161_v+0.5])//x, y, z
+ })
+
+ this.deadE = this.deadE.filter(e=>{
+ if(Date.now()-e[0] > 5000){
+ delete this.beaconPoints[e[1]]
+ delete this.beaconLocations[e[1]]
+ return false
+ }
+
+ let location = this.beaconLocations[e[1]]
+ if(!location){
+ delete this.beaconPoints[e[1]]
+ delete this.beaconLocations[e[1]]
+ return false
+ }
+
+ if(World.getBlockAt(location[0], location[1], location[2]).getID() === 138){
+ Client.showTitle("&cGO TO BEACON!","&c" + (Math.max(0,5000-(Date.now()-e[0]))/1000).toFixed(1) + "s",0,20,10)
+ World.playSound("note.pling",1,1)
+ }else{
+ delete this.beaconPoints[e[1]]
+ delete this.beaconLocations[e[1]]
+ return false
+ }
+ return true
+ })
+
+ if(this.emanBoss){
+ this.emanHpElement.setText("&6Enderman&7> " + this.emanBoss.getName().split("Voidgloom Seraph")[1].trim())
+ }else{
+ this.emanHpElement.setText("")
+ }
+ }
+
+ apiLoad(data, dataType, isSoopyServer, isLatest){
+ if(!isSoopyServer || !isLatest) return
+ if(dataType !== "skyblock") return
+
+ this.slayerExp.zombie = data.data.profiles[data.data.stats.currentProfileId].members[Player.getUUID().replace(/-/g, "")].slayer.zombie.xp
+ this.slayerExp.spider = data.data.profiles[data.data.stats.currentProfileId].members[Player.getUUID().replace(/-/g, "")].slayer.spider.xp
+ this.slayerExp.wolf = data.data.profiles[data.data.stats.currentProfileId].members[Player.getUUID().replace(/-/g, "")].slayer.wolf.xp
+ this.slayerExp.enderman = data.data.profiles[data.data.stats.currentProfileId].members[Player.getUUID().replace(/-/g, "")].slayer.enderman.xp
+ }
+
+ renderOverlay(){
+ if(this.slainAlert.getValue() && this.bossSlainMessage){
+ let scale = Renderer.getStringWidth(ChatLib.removeFormatting("BOSS SLAIN"))/(Renderer.screen.getWidth()*0.75)
+
+ Renderer.scale(1/scale, 1/scale)
+ Renderer.drawString("&4BOSS SLAIN", (Renderer.screen.getWidth()*0.125)*scale, (Renderer.screen.getHeight()/2-9/scale)*scale)
+ Renderer.scale(1, 1)
+ }
+ if(this.spawnAlert.getValue() && this.bossSpawnedMessage && Date.now()-this.lastBossNotSpawnedTime<3000){
+ let scale = Renderer.getStringWidth(ChatLib.removeFormatting("BOSS SPAWNED"))/(Renderer.screen.getWidth()*0.75)
+
+ Renderer.scale(1/scale, 1/scale)
+ Renderer.drawString("&4BOSS SPAWNED", (Renderer.screen.getWidth()*0.125)*scale, (Renderer.screen.getHeight()/2-9/scale)*scale)
+ Renderer.scale(1, 1)
+ }
+ }
+
+ initVariables(){
+ this.expOnKill = undefined
+ this.slainAlert = undefined
+ this.spawnAlert = undefined
+ this.slayerExp = undefined
+ this.slayerExpLoaded = undefined
+ this.lastSlayerType = undefined
+ this.lastSlayerExp = undefined
+ this.bossSpawnedMessage = undefined
+ this.lastBossNotSpawnedTime = undefined
+ this.bossSlainMessage = undefined
+ this.todoE = undefined
+ this.beaconPoints = undefined
+ this.beaconE = undefined
+ this.deadE = undefined
+ this.beaconLocations = undefined
+ this.emanBoss = undefined
+ this.eyeE = undefined
+ this.nextIsBoss = undefined
+ this.hudElements = []
+ this.todoE2 = undefined
+ }
+
+ onDisable(){
+ this.initVariables()
+ }
+}
+
+module.exports = {
+ class: new Slayers()
+} \ No newline at end of file