diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 510c9ec..0000000 --- a/.babelrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "presets": [], - "plugins": [ - "./babel-substitute-mappings/babel-substitute-mappings.mjs" - ] -} \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 8db7d82..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,24 +0,0 @@ -# This is a basic workflow to help you get started with Actions - -name: CI - -# Controls when the workflow will run -on: [push, pull_request, workflow_dispatch] - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "build" - Check_Compiles: - # The type of runner that the job will run on - runs-on: ubuntu-latest - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 - - - name: Import node modules - run: npm i - - - name: Compile - run: npx babel --delete-dir-on-start --retain-lines . -d "out/BetterMap" --copy-files --no-copy-ignored --minified --no-comments --ignore "**/babal-substitute-mappings/**","**/.git/**","**/build.bat","**/init.bat","**/node_modules/**" diff --git a/.gitignore b/.gitignore index fb07a88..27a688b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ -Data/roomdata.json out -node_modules \ No newline at end of file +node_modules +.gradle +.idea +build +.vscode \ No newline at end of file diff --git a/Components/Door.js b/Components/Door.js index 6ba78a7..3195467 100644 --- a/Components/Door.js +++ b/Components/Door.js @@ -11,6 +11,18 @@ class Door { this.horizontal = horizontal } + + getX() { + return this.position.worldX + } + + getZ() { + return this.position.worldY + } + + toString() { + return `Door[(${this.getX()}, ${this.getZ()}), (${this.position.arrayX}, ${this.position.arrayY}) ${this,this.type}]` + } } export default Door \ No newline at end of file diff --git a/Components/DungeonMap.js b/Components/DungeonMap.js index 05c2be9..7b96bb7 100644 --- a/Components/DungeonMap.js +++ b/Components/DungeonMap.js @@ -1,4 +1,3 @@ -import { f, m } from "../../mappings/mappings.js" import Position from "../Utils/Position.js" import MapPlayer from "./MapPlayer.js" import Room from "./Room.js" @@ -6,13 +5,14 @@ import Room from "./Room.js" import { getScoreboardInfo, getTabListInfo, getRequiredSecrets } from "../Utils/Score" import Door from "./Door.js" import DungeonRoomData from "../Data/DungeonRoomData.js" -import { changeScoreboardLine, dungeonOffsetX, dungeonOffsetY, MESSAGE_PREFIX, MESSAGE_PREFIX_SHORT, renderLore, getPlayerName } from "../Utils/Utils.js" +import { changeScoreboardLine, dungeonOffsetX, dungeonOffsetY, MESSAGE_PREFIX, MESSAGE_PREFIX_SHORT, renderLore, getPlayerName, getCore, getHighestBlock, getComponentFromPos, Checkmark, chunkLoaded } from "../Utils/Utils.js" import socketConnection from "../socketConnection.js" import DataLoader from "../Utils/DataLoader.js" import { fetch } from "../Utils/networkUtils.js" import renderLibs from "../../guimanager/renderLibs.js" import settings from "../Extra/Settings/CurrentSettings.js" import { RoomEvents, toDisplayString } from "./RoomEvent.js" +import RoomComponent from "../Utils/RoomComponent.js" let PlayerComparator = Java.type("net.minecraft.client.gui.GuiPlayerTabOverlay").PlayerComparator let c = PlayerComparator.class.getDeclaredConstructor() @@ -22,9 +22,23 @@ let sorter = c.newInstance() class DungeonMap { constructor(floor, deadPlayers, registerEvents = true) { /** - * @type {Map} The string is in form x,y eg 102,134 and will correspond to the top left corner of a room component + * Maps Rooms to their RoomComponents, making for fast lookups. DO NOT create new RoomComponents. Only use the ones in roomComponentArray. + * @type {Map} */ this.rooms = new Map() + this.roomComponentArray = [] + this.scannedComponents = new Set() // For scanning, don't wanna re-scan a position multiple times + this.unknownPuzzles = new Set() // Set of Rooms which are Room.PUZZLE and have no room data + + // Initialize the array of Positions, every spot in the 6x6 area where a room can be + for (let i = 0; i < 36; i++) { + let x = i%6 + let z = Math.floor(i/6) + let rx = -185 + x * 32 + let rz = -185 + z * 32 + let component = new RoomComponent(rx, rz, this) + this.roomComponentArray.push(component) + } /** * @type {Map} The string is in form x,y eg 102,134 and will correspond to the top left corner of a door */ @@ -47,6 +61,7 @@ class DungeonMap { this.floorNumber = this.floor == "E" ? 0 : parseInt(this.floor[this.floor.length - 1]) this.deadPlayers = deadPlayers + this.playerNick = null; this.lastChanged = Date.now() @@ -80,6 +95,8 @@ class DungeonMap { this.lastChange = 0 this.roomXY = "0,0" this.lastXY = undefined + this.lastStandingPos = null // Position of where the player was last standing + this.lastRoomChange = null // Time the player last walked into a new room component // Simulate changing bloccks to air to fix green room not having air border around it this.setAirLocs = new Set() @@ -100,6 +117,9 @@ class DungeonMap { this.keys = 0 this.bloodOpen = false + // The MapID that represents this dungeon, looked for if the player doesn't have a map in the hotbar. + this.mapId = undefined; + //initialize with 0, only if score is below threshold will they get set to 1 then set to 2 after said this.broadcast270message = 0; this.broadcast300message = 0; @@ -107,189 +127,518 @@ class DungeonMap { let mimicDeadMessages = ["$SKYTILS-DUNGEON-SCORE-MIMIC$", "Mimic Killed!", "Mimic Dead!", "Mimic dead!"] this.triggers = [] - if (registerEvents) { - this.triggers.push(register("chat", (msg) => { - mimicDeadMessages.forEach(dmsg => { - if (msg.includes(dmsg)) this.mimicKilled = true - }) - }).setChatCriteria("&r&9Party &8> ${msg}")) - this.triggers.push(register("chat", (end, e) => { - if (end.includes("Stats")) return + if (!registerEvents) return - this.dungeonFinished = true + this.triggers.push(register("chat", (msg) => { + mimicDeadMessages.forEach(dmsg => { + if (msg.includes(dmsg)) this.mimicKilled = true + }) + }).setChatCriteria("&r&9Party &8> ${msg}")) - if (!settings.settings.clearedRoomInfo) return - this.players.forEach(p => p.updateCurrentSecrets()) + this.dungeonStart = 0 + register("chat", () => { + this.dungeonStart = Math.floor(Date.now() / 1000) + }).setCriteria("Mort: Here, I found this map when I first entered the dungeon").setContains(); - Client.scheduleTask(5 * 20, () => { // Wait 5 seconds (5*20tps) - ChatLib.chat(MESSAGE_PREFIX + "Cleared room counts:") - this.players.forEach(p => { - let mess = new Message() - mess.addTextComponent(new TextComponent(MESSAGE_PREFIX_SHORT + "&3" + p.username + "&7 cleared ")) + // this.triggers.push(register("command", () => { + // this.roomsArr.forEach(room => ChatLib.chat(room.toString())) + // }).setName("sayrooms")) - let roomLore = "" - p.roomsData.forEach(([players, room]) => { - let name = room.data?.name ?? room.shape - let type = room.typeToName() - let color = room.typeToColor() + this.triggers.push(register("chat", () => { + this.dungeonFinished = true - let stackStr = players.length === 1 ? "" : " Stacked with " + players.filter(pl => pl !== p).map(p => p.username).join(", ") + if (!settings.settings.clearedRoomInfo) return + this.players.forEach(p => p.updateCurrentSecrets()) - roomLore += `&${color}${name} (${type})${stackStr}\n` - }) + Client.scheduleTask(5 * 20, () => { // Wait 5 seconds (5*20tps) + ChatLib.chat(MESSAGE_PREFIX + "Cleared room counts:") + this.players.forEach(p => { + let final = new Message() + final.addTextComponent(new TextComponent(MESSAGE_PREFIX_SHORT + "&3" + p.username + "&7 cleared ")) - mess.addTextComponent(new TextComponent("&6" + p.minRooms + "-" + p.maxRooms).setHover("show_text", roomLore.trim())) + let roomLore = "" + p.roomsData.forEach(([players, room]) => { + let name = room.name ?? room.shape + let type = room.typeToName() + let color = room.typeToColor() - if (settings.settings.apiKey) { - mess.addTextComponent(new TextComponent("&7 rooms | &6" + p.secretsCollected + "&7 secrets")) - } - else { - mess.addTextComponent(new TextComponent("&7 rooms and got &c[NO API KEY]&7 secrets")) - } - mess.addTextComponent(new TextComponent("&7 | &6" + p.deaths + "&7 deaths")) + let stackStr = players.length === 1 ? "" : " Stacked with " + players.filter(pl => pl !== p).map(p => p.username).join(", ") - mess.chat() + roomLore += `&${color}${name} (${type})${stackStr}\n` }) + + final.addTextComponent(new TextComponent("&6" + p.minRooms + "-" + p.maxRooms).setHover("show_text", roomLore.trim())) + + final.addTextComponent(new TextComponent("&7 rooms | &6" + p.secretsCollected + "&7 secrets")) + + final.addTextComponent(new TextComponent("&7 | &6" + p.deaths + "&7 deaths")) + + final.chat() }) - }).setChatCriteria('&r&c${*}e Catacombs &r&8- &r&eFloor${end}').setContains()) - //&r&r&r &r&cThe Catacombs &r&8- &r&eFloor I Stats&r - //&r&r&r &r&cMaster Mode Catacombs &r&8- &r&eFloor III Stats&r - //&r&r&r &r&cThe Catacombs &r&8- &r&eFloor V&r - - this.triggers.push(register("entityDeath", (entity) => { - if (entity.getClassName() !== "EntityBlaze") return - this.deadBlazes++; - if (this.deadBlazes === 10) { - this.roomsArr.forEach(room => { - if (room.data?.name?.toLowerCase() === 'higher or lower') { - room.checkmarkState = room.currentSecrets ? Room.COMPLETED : Room.CLEARED; - } - }) + }) + }).setChatCriteria(/^\s*(Master Mode)? ?(?:The)? Catacombs - (Entrance|Floor .{1,3})$/)) // https://regex101.com/r/W4UjWQ/2 - this.sendSocketData({ type: "blazeDone" }) - } - })) - this.triggers.push(register("entityDeath", (entity) => { - if (entity.getClassName() !== "EntityZombie") return - let e = entity.getEntity() - if (!e.func_70631_g_()) return // .isChild() - - // Check all armor slots, if they are all null then mimic is die! - if ([0, 1, 2, 3].every(a => e.func_82169_q(a) === null)) { - // ChatLib.chat("Mimic Kapow!") - this.mimicKilled = true - this.sendSocketData({ type: "mimicKilled" }) - } - })) + this.triggers.push(register("entityDeath", (entity) => { + if (entity.getClassName() !== "EntityBlaze") return + this.deadBlazes++; + + if (this.deadBlazes !== 10) return - this.triggers.push(register("chat", (info) => { - let player = ChatLib.removeFormatting(info).split(" ")[0] + this.roomsArr.forEach(room => { + if (room.name !== 'Blaze') return + room.checkmarkState = room.currentSecrets ? Checkmark.GREEN : Checkmark.WHITE; + }) - for (let p of this.players) { - if (p.username === player) { - p.deaths++ - } + this.sendSocketData({ type: "blazeDone" }) + })) + + this.triggers.push(register("entityDeath", (entity) => { + if (entity.getClassName() !== "EntityZombie") return + let e = entity.getEntity() + if (!e.func_70631_g_()) return // .isChild() + + // Check all armor slots, if they are all null then mimic is die! + if ([0, 1, 2, 3].every(a => e.func_82169_q(a) === null)) { + // ChatLib.chat("Mimic Kapow!") + this.mimicKilled = true + this.sendSocketData({ type: "mimicKilled" }) + } + })) + + this.triggers.push(register("chat", (info) => { + let player = ChatLib.removeFormatting(info).split(" ")[0]; + for (let p of this.players) { + if (p.username === player || p.username == Player.getName() && player.toLowerCase() === 'you') { + p.deaths++; } + } - this.scanFirstDeathForSpiritPet(player) - }).setChatCriteria("&r&c ☠ ${info} and became a ghost&r&7.&r")) + this.scanFirstDeathForSpiritPet(player); + }).setChatCriteria("&r&c ☠ ${info} became a ghost&r&7.&r")); - this.triggers.push(register("chat", (info) => { - this.roomsArr.forEach(r => { - if (r.type === Room.BLOOD) { - r.checkmarkState = Room.CLEARED - this.markChanged() + this.triggers.push(register("chat", (info) => { + this.roomsArr.forEach(r => { + if (r.type !== Room.BLOOD) return + + r.checkmarkState = Room.CLEARED + this.markChanged() + }) + }).setChatCriteria("[BOSS] The Watcher: That will be enough for now.")) + + this.triggers.push(register("step", () => { + this.pingIdFuncs.forEach(([timestamp, callback], id) => { + if (Date.now() - timestamp < 5000) return + + callback(false) + this.pingIdFuncs.delete(id) + }) + }).setFps(1)) + + this.triggers.push(register("tick", () => { + this.scanCurrentRoom() + })) + + this.triggers.push(register("chat", () => { + this.bloodOpen = true + this.keys-- + }).setCriteria(/^The BLOOD DOOR has been opened!$/)) + + this.triggers.push(register("chat", () => { + this.keys++ + }).setCriteria(/^(?:\[[\w\+-]+\] )?\w+ has obtained \w+ Key!$/)) + + this.triggers.push(register("chat", () => { + this.keys++ + }).setCriteria(/^A (?:Wither|Blood) Key was picked up!$/)) + + this.triggers.push(register("chat", () => { + this.keys-- + }).setCriteria(/^\w+ opened a WITHER door!$/)) + } + + /** + * + * @param {Number} worldX + * @param {Number} worldZ + * @returns {Room | null} + */ + getRoomAt(worldX, worldZ) { + const component = this.getComponentAt(worldX, worldZ) + + return this.rooms.get(component) ?? null + } + + /** + * + * @param {RoomComponent} component + * @returns {Room | null} + */ + getRoomAtComponent(component) { + return this.rooms.get(component) ?? null + } + + /** + * + * @param {Number} arrayX - 0-5 + * @param {Number} arrayY - 0-5 + * @returns {Room | null} + */ + getRoomAtArrayPos(arrayX, arrayY) { + const index = arrayX + arrayY * 6 + if (index < 0 || index > 35) return null + + return this.getRoomAtComponent(this.roomComponentArray[index]) + } + + /** + * + * @param {Door} door + */ + addDoor(door) { + this.doors.set(door.position.arrayStr, door) + this.markChanged() + } + + /** + * Adds the room to this dungeon and handles all of the backend shit + * @param {Room} room + */ + addRoom(room) { + this.roomsArr.add(room) + room.components.forEach(component => { + this.rooms.set(component, room) + }) + + if (room.type == Room.PUZZLE && !room.data) { + this.unknownPuzzles.add(room) + } + + this.markChanged() + } + + /** + * + * @param {Room} room + */ + deleteRoom(room) { + this.roomsArr.delete(room) + room.components.forEach(component => { + // In case this component got mapped to another room too somehow + if (this.rooms.get(component) !== room) return + + this.rooms.delete(component) + }) + } + + /** + * Merges two rooms. The second room will be merged into the first and the old one will be deleted. + * @param {Room} room1 + * @param {Room} room2 + */ + mergeRooms(room1, room2) { + this.deleteRoom(room2) + + if (room2.type) room1.type = room2.type + + if (room2.data) { + room1.setRoomData(room2.data) + } + + room2.components.forEach(component => room1.addComponent(component)) + + this.markChanged() + } + + /** + * Checks to see whether both sides of a door have opened rooms + * @param {Door} door + */ + shouldDoorBeGray(door) { + let dx = 0 + let dz = 16 + if (door.horizontal) { + dx = 16 + dz = 0 + } + + let room1 = this.getRoomAt(door.getX()+dx, door.getZ()+dz) + let room2 = this.getRoomAt(door.getX()-dx, door.getZ()-dz) + + return !room1 || room1.type == Room.UNKNOWN || !room2 || room2.type == Room.UNKNOWN + } + + scanCurrentRoom() { + const currPos = this.getComponentAt(Player.getX(), Player.getZ()) + if (!currPos || !chunkLoaded(currPos.worldX, 68, currPos.worldY)) return + + // [dx, dy, horizontal (for doors)] + const directions = [ + [0, -16, false], // Up + [16, 0, true], // Right + [0, 16, false], // Down + [-16, 0, true] // Left + ] + + // Walked into a new component in the dungeon, scan the current room + if (currPos !== this.lastStandingPos) { + this.lastStandingPos = currPos + this.lastRoomChange = Date.now() + } + + + // Check to see if this room has already been scanned, and get its rotation if needed + let room = this.getRoomAtComponent(currPos) + if (room && room.roofHeight && room.data) { + if (!room.corner) room.findRotationAndCorner() + return + } + + if (this.scannedComponents.has(currPos)) return + this.scannedComponents.add(currPos) + + // const scannedRooms = new Set() // To send via socket after scanning is done + // const scannedDoors = new Set() + + const searched = new Set() + const queue = [currPos] + + while (queue.length) { + let component = queue.shift() + searched.add(component) + // ChatLib.chat(`Searching ${component}`) + + let worldX = component.worldX + let worldZ = component.worldY + + let highestBlock = getHighestBlock(worldX, worldZ) + if (!highestBlock) continue + + if (!room) { + room = new Room(this, Room.UNKNOWN, [component], highestBlock) + // scannedRooms.add(room) + // ChatLib.chat(`Created room ${room}`) + this.addRoom(room) + } + + room.roofHeight = highestBlock + + let core = getCore(worldX, worldZ) + let roomData = DungeonRoomData.getDataFromCore(core) + + if (roomData && !room.data) { + room.setRoomData(roomData) + this.markChanged() + + } + + if (room.checkmarkState == Checkmark.GRAY) room.checkmarkState = Checkmark.NONE + + for (let dir of directions) { + let [dx, dz, horizontal] = dir + + let newComponent = this.getComponentAt(worldX+dx*2, worldZ+dz*2) + if (!newComponent) continue // Outside of the dungeon area + + let highest = getHighestBlock(worldX+dx, worldZ+dz) + if (!highest) continue // Nothing here, no room extension or doors + + let block = World.getBlockAt(worldX+dx, highestBlock, worldZ+dz) + let block2 = World.getBlockAt(worldX+dx, highestBlock+1, worldZ+dz) + + let doorPos = new Position(worldX+dx, worldZ+dz, this) + let doorBlock = World.getBlockAt(doorPos.worldX, 69, doorPos.worldY) + let doorBlockId = doorBlock.type.getID() + + // There is a door here, roof heights do not match, or the block where the door should be is infested stonebrick (Spawn door) + if (block.type.getID() == 0 || block2.type.getID() !== 0 || (doorBlockId == 97 && doorBlock.getMetadata() == 5)) { + let door = this.doors.get(doorPos.arrayStr) + if (!door) { + door = new Door(Room.UNKNOWN, doorPos, horizontal) } - }) - }).setChatCriteria("[BOSS] The Watcher: That will be enough for now.")) - this.triggers.push(register("step", () => { - this.pingIdFuncs.forEach(([timestamp, callback], id) => { - if (Date.now() - timestamp < 5000) return + // Add a gray room here if nothing exists already + if (!this.getRoomAtComponent(newComponent)) { + let newRoom = new Room(this, Room.UNKNOWN, [newComponent], highest) + // scannedRooms.add(newRoom) + newRoom.checkmarkState = Checkmark.GRAY + this.addRoom(newRoom) + } - callback(false) - this.pingIdFuncs.delete(id) - }) - }).setFps(1)) - - // On dungeon start - // this.triggers.push(register("chat", () => { - // // wait 2 secs - // Client.scheduleTask(2 * 20, () => { - // // update all player classes - // this.players.forEach(p => { - // p.updateDungeonClass().updatePlayerColor() - // }) - // }) - // }).setChatCriteria("&r&aDungeon starts in 1 second.&r")) - - this.triggers.push(register("chat", () => { - this.bloodOpen = true - this.keys-- - }).setChatCriteria("&r&cThe &r&c&lBLOOD DOOR&r&c has been opened!&r")) - - this.triggers.push(register("chat", () => { - this.keys++ - }).setChatCriteria("${*} &r&ehas obtained &r&a&r&${*} Key&r&e!&r")) - - this.triggers.push(register("chat", () => { - this.keys++ - }).setChatCriteria("&r&eA &r&a&r&${*} Key&r&e was picked up!&r")) - - this.triggers.push(register("chat", () => { - this.keys-- - }).setChatCriteria("&r&a${player}&r&a opened a &r&8&lWITHER &r&adoor!&r")) + // ChatLib.chat(`Door block ${room.name}: ${doorBlockId}`) + + // Air or barrier blocks + if ((doorBlockId == 0 || doorBlockId == 166) && !this.shouldDoorBeGray(door)) door.type = Room.NORMAL + else if (doorBlockId == 97) door.type = Room.SPAWN + else if (doorBlockId == 173) { + door.type = Room.BLACK + this.witherDoors.add(door) + } + else if (doorBlockId == 159) { + door.type = Room.BLOOD + this.witherDoors.add(door) + } + + // ChatLib.chat(`Added door ${door} from ${room}`) + // scannedDoors.add(door) + this.addDoor(door) + continue + } + + // ChatLib.chat(`Adding ${newComponent} to ${room}`) + + // Don't want an extra long entrance room + if (room.type == Room.SPAWN) continue + + // Otherwise this is just a room extension, so extend the room outwards! + room.addComponent(newComponent) + // scannedRooms.add(room) + // ChatLib.chat(`Added ${newComponent} to ${room}`) + this.markChanged() + + if (searched.has(newComponent)) { + // ChatLib.chat(`Already searched ${newComponent}`) + continue + } + queue.push(newComponent) + // ChatLib.chat(`QUEUE ${newComponent}`) + } } + + // scannedRooms.forEach(room => { + // let data = { + // type: "newRoom", + // components: room.components.map(a => [a.arrayX, a.arrayY]), + // roomType: room.type, + // cores: room.cores, + // roofHeight: room.roofHeight + // } + // this.sendSocketData(data) + // this.socketData(data) + // }) + + // scannedDoors.forEach(door => { + // let data = { + // type: "newDoor", + // x: door.getX(), + // z: door.getZ(), + // doorType: door.type, + // horizontal: door.horizontal + // } + // this.sendSocketData(data) + // this.socketData(data) + // }) + + // this.sendSocketData({ + // type: "roomLocation", + // x, y, rotation, roomId + // }) + } + getComponentAtArrayPos(x, z) { + const index = x + z*6 + + if (index < 0 || index > 35) return null + + return this.roomComponentArray[index] + } + + /** + * Gets the Position at the given worldX and worldZ coordinate assuming they are inside of the dungeon area + * will return null if the coord is not inside of the dungeon + * @param {Number} worldX + * @param {Number} worldZ + * @returns {Position | null} + */ + getComponentAt(worldX, worldZ) { + const [x, z] = getComponentFromPos(worldX, worldZ) + + return this.getComponentAtArrayPos(x, z) + } + socketData(data) { + // ChatLib.chat(`SOCKET DATA: ${JSON.stringify(data)}`) + switch (data.type) { case "playerLocation": - let p = this.players[this.playersNameToId[data.username]] - if (!p) return + let player = this.players[this.playersNameToId[data.username]] + if (!player) return - p.setXAnimate(data.x, 350) - p.setYAnimate(data.z, 350) - p.setRotateAnimate(data.yaw, 350) - p.locallyUpdated = Date.now() + player.setXAnimate(data.x, 350) + player.setYAnimate(data.z, 350) + player.setRotateAnimate(data.yaw, 350) + player.locallyUpdated = Date.now() break; + case "roomSecrets": - let currentRoom = this.rooms.get(data.x + ',' + data.y); + let room = this.getRoomAtArrayPos(data.x, data.y) - if (!currentRoom || currentRoom.type === Room.UNKNOWN) return; // Current room not loaded yet + if (!room || room.type === Room.UNKNOWN) return // Current room not loaded yet - if (currentRoom.currentSecrets !== data.min) { - currentRoom.currentSecrets = data.min - currentRoom.maxSecrets = data.max + if (room.currentSecrets !== data.min) { + room.currentSecrets = data.min + room.maxSecrets = data.max this.markChanged() // Re-render map incase of a secret count specific texturing } break; - case "doorLocation": - this.setDoor(data.x, data.y, data.ishorizontal, false, data.doorType) - break; - case "roomLocation": - this.setRoom(data.x, data.y, data.rotation, data.roomId, false) - break; - case "roomId": - let currentRoom2 = this.rooms.get(data.x + ',' + data.y); - - if (!currentRoom2 || currentRoom2.roomId || currentRoom2.type === Room.UNKNOWN) return; // Current room not loaded yet, or already loaded id - currentRoom2.roomId = data.roomId; - - this.markChanged() // Re-render map incase of a room-id specific texturing + case "newDoor": + // {type: Door.NORMAL, worldX: 69, worldZ: 69, horizontal: true} + // let { type, doorType, x, z, horizontal } = data + + // let doorPos = new Position(x, z, this) + // let door = new Door(doorType, doorPos, horizontal) + // this.addDoor(door) + // break; + + case "newRoom": + // { + // let { components, roomType, cores, roofHeight } = data + + // let componentArr = components.map(([x, y]) => this.getComponentAtArrayPos(x, y)) + // if (componentArr.some(a => a == null)) return + + + // let room = new Room(this, roomType, componentArr, roofHeight) + // if (roomType == Room.UNKNOWN) room.checkmarkState = Checkmark.GRAY + + // if (cores) { + // for (let core of cores) { + // if (room.loadFromCore(core)) break + // } + // } + + // // Delete existing rooms in this area + // componentArr.forEach(component => { + // let existingRoom = this.getRoomAtComponent(component) + // if (existingRoom) { + // this.deleteRoom(existingRoom) + // // ChatLib.chat(`&eMerging ${existingRoom} into ${room}`) + // this.mergeRooms(room, existingRoom) + // } + // }) + + + + // // ChatLib.chat(`&aAdding room from socket: ${room}`) + + // this.addRoom(room) + // } break; + case "mimicKilled": this.mimicKilled = true break; + case "blazeDone": this.roomsArr.forEach(room => { - if (room.data?.name?.toLowerCase() === 'higher or lower') { - room.checkmarkState = room.currentSecrets ? Room.COMPLETED : Room.CLEARED; + if (room.name === 'Blaze') { + room.checkmarkState = room.currentSecrets ? Checkmark.GRAY : Checkmark.WHITE; } }) break; + case "secretCollect": this.collectedSecrets.add(data.location) break; @@ -326,33 +675,10 @@ class DungeonMap { this.doors.clear() this.rooms.clear() this.roomsArr.clear() - this.lastRoomId = undefined - this.identifiedRoomIds.clear() - } - - addDoorToAdjacentRooms(door) { - if (door.horizontal) { - let left = door.position.arrayX - 1; - let right = door.position.arrayX - let y = Math.round(door.position.arrayY - 0.3); - let leftRoom = this.rooms.get(left + ',' + y); - let rightRoom = this.rooms.get(right + ',' + y); - if (leftRoom) leftRoom.addDoor(door); - if (rightRoom) rightRoom.addDoor(door); - } - else { - let up = door.position.arrayY - 1 - let down = door.position.arrayY - let x = Math.round(door.position.arrayX - 0.3); - let upRoom = this.rooms.get(x + ',' + up); - let downRoom = this.rooms.get(x + ',' + down); - if (upRoom) upRoom.addDoor(door); - if (downRoom) downRoom.addDoor(door); - } - } sendSocketData(data) { + // ChatLib.chat(`Sending socket data: ${JSON.stringify(data)}`) socketConnection.sendDungeonData({ data, players: this.players.map(a => a.username) }) } @@ -375,49 +701,60 @@ class DungeonMap { * Update players from tab list, also sends locations of players in render distance to other players */ updatePlayers() { - if (!Player.getPlayer()) return //How tf is this null sometimes wtf - let pl = Player.getPlayer()[f.sendQueue.EntityPlayerSP][m.getPlayerInfoMap]().sort((a, b) => sorter.compare(a, b)) // Tab player list + if (!Player.getPlayer()) return; //How tf is this null sometimes wtf + let pl = Player.getPlayer().field_71174_a.func_175106_d().sort((a, b) => sorter.compare(a, b)); // Tab player list - let i = 0 + let i = 0; - let thePlayer = undefined + let thePlayer = undefined; for (let p of pl) { - if (!p[m.getDisplayName.NetworkPlayerInfo]()) continue - let line = p[m.getDisplayName.NetworkPlayerInfo]()[m.getUnformattedText]() + if (!p.func_178854_k()) continue; + let line = p.func_178854_k().func_150260_c(); // https://regex101.com/r/cUzJoK/3 - line = line.replace(/§[a-fnmz0-9r]/g, ''); //support dungeons guide custom name colors + line = line.replace(/§./g, ''); //support dungeons guide custom name colors let match = line.match(/^\[(\d+)\] (?:\[\w+\] )*(\w+) (?:.)*?\((\w+)(?: (\w+))*\)$/); - if (!match) continue - let [_, sbLevel, name, clazz, level] = match - sbLevel = parseInt(sbLevel) + if (!match) continue; + let [_, sbLevel, name, clazz, level] = match; + sbLevel = parseInt(sbLevel); // This is a tab list line for a player - let playerName = getPlayerName(Player) - if (name === playerName) { // Move the current player to end of list - thePlayer = [p, name, match] - continue + let playerName = getPlayerName(Player); + if (name === playerName || name === this.playerNick) {// Move the current player to end of list + thePlayer = [p, name, match]; + continue; } - if (!this.players[i]) this.players[i] = new MapPlayer(p, this, name) - this.players[i].networkPlayerInfo = p - this.playersNameToId[name] = i - this.players[i].updateTablistInfo(match) + if (!this.players[i]) this.players[i] = new MapPlayer(p, this, name); + this.players[i].networkPlayerInfo = p; + this.playersNameToId[name] = i; + this.players[i].updateTablistInfo(match); - i++ + i++; } - if (thePlayer) { // Move current player to end of list - let [networkInfo, name, matchObject] = thePlayer - if (!this.players[i]) this.players[i] = new MapPlayer(networkInfo, this, name) - this.players[i].networkPlayerInfo = networkInfo - this.playersNameToId[thePlayer[1]] = i - this.players[i].updateTablistInfo(matchObject) + if (thePlayer) {// Move current player to end of list + let [networkInfo, name, matchObject] = thePlayer; + if (!this.players[i]) this.players[i] = new MapPlayer(networkInfo, this, name); + + this.players[i].networkPlayerInfo = networkInfo; + this.playersNameToId[thePlayer[1]] = i; + if (this.playerNick) this.playersNameToId[Player.getName()] = i; + + this.players[i].updateTablistInfo(matchObject); + } + else if (!this.playerNick) { + //find the players nick + pl.forEach(playerInfo => { + if (playerInfo.func_178845_a().getId() == Player.getUUID()) { + this.playerNick = playerInfo.func_178845_a().getName(); + } + }) } for (let player of this.players) { let room = player.getRoom(this); - if (player.currentRoomCache == room) continue - if (player.currentRoomCache) player.currentRoomCache.addEvent(RoomEvents.PLAYER_EXIT, player) - player.currentRoomCache = room - room?.addEvent(RoomEvents.PLAYER_ENTER, player) + if (player.currentRoomCache == room) continue; + if (player.currentRoomCache) player.currentRoomCache.addEvent(RoomEvents.PLAYER_EXIT, player); + player.currentRoomCache = room; + room?.addEvent(RoomEvents.PLAYER_ENTER, player); } } @@ -578,245 +915,194 @@ class DungeonMap { } /** - * Update dungeon from map data - * @param {Object} mapData + * Tries to find the top left of the dungeon map, returns true if successful or false if it fails to find it + * @param {Number[]} mapColords * @returns */ - updateFromMap(mapData) { - if (this.dungeonFinished) return + loadDungeonTopLeft(mapColors) { + // Find the top left pixel of the entrance room, the first green pixel which has another green pixel 15 to the right and 15 down + let thing = mapColors.findIndex((a, i) => a == 30 && i + 15 < mapColors.length && mapColors[i + 7] == 30 && mapColors[i + 15] == 30) + if (thing == -1) return false - this.loadPlayersFromDecoration(mapData[f.mapDecorations]) + // Get the room size + let i = 0 + while (mapColors[thing + i] == 30) i++ + this.widthRoomImageMap = i + this.roomAndDoorWidth = this.widthRoomImageMap + 4 - let mapColors = mapData[f.colors.MapData] + // Find the corner of the top left most room on the map + let x = (thing % 128) % this.roomAndDoorWidth + let y = Math.floor(thing / 128) % this.roomAndDoorWidth - if (!this.dungeonTopLeft) { - // Find the top left pixel of the entrance room - let thing = mapColors.findIndex((a, i) => a == 30 && i + 15 < mapColors.length && mapColors[i + 7] == 30 && mapColors[i + 15] == 30) - if (thing == -1) return + // Adjust for Entrance and Floor 1's altered map position + if ([0, 1].includes(this.floorNumber)) x += this.roomAndDoorWidth + if (this.floorNumber == 0) y += this.roomAndDoorWidth - // Get the room size - let i = 0 - while (mapColors[thing + i] == 30) i++ - this.widthRoomImageMap = i - this.roomAndDoorWidth = this.widthRoomImageMap + 4 + this.dungeonTopLeft = [x, y] + this.fullRoomScaleMap = Math.floor(this.widthRoomImageMap * 5 / 4) - // Find the corner of the top left most room on the map - let x = (thing % 128) % this.roomAndDoorWidth - let y = Math.floor(thing / 128) % this.roomAndDoorWidth + return true + } - // Adjust for Entrance and Floor 1's altered map position - if ([0, 1].includes(this.floorNumber)) x += this.roomAndDoorWidth - if (this.floorNumber == 0) y += this.roomAndDoorWidth + /** + * Update dungeon from map data + * @param {Object} mapData + * @returns + */ + updateFromMap(mapData) { + if (this.dungeonFinished) return - this.dungeonTopLeft = [x, y] - this.fullRoomScaleMap = Math.floor(this.widthRoomImageMap * 5 / 4) - } + // .mapDecorators + this.loadPlayersFromDecoration(mapData.field_76203_h) + // .colors + let mapColors = mapData.field_76198_e - if (!this.dungeonTopLeft) return + if (!this.dungeonTopLeft && !this.loadDungeonTopLeft(mapColors)) return - let roomColors = { + // Includes door colors too + const roomColors = { + 63: Room.NORMAL, 30: Room.SPAWN, 66: Room.PUZZLE, 82: Room.FAIRY, 18: Room.BLOOD, 62: Room.TRAP, 74: Room.MINIBOSS, - 85: Room.UNKNOWN + 85: Room.UNKNOWN, + 119: Room.BLACK, } - for (let y = 0; y < 6; y++) {// Scan top left of rooms looking for valid rooms - for (let x = 0; x < 6; x++) { - let mapX = this.dungeonTopLeft[0] + this.roomAndDoorWidth * x - let mapY = this.dungeonTopLeft[1] + this.roomAndDoorWidth * y - if (mapX > 127 || mapY > 127) continue - let pixelColor = mapColors[mapX + mapY * 128] - if (!pixelColor) continue - if (pixelColor in roomColors) { - if (roomColors[pixelColor] === Room.BLOOD) { - this.bloodOpen = true - } + const checkmarkColors = { + 34: Checkmark.WHITE, + 30: Checkmark.GREEN, + 18: Checkmark.FAILED, + 119: Checkmark.GRAY, + } + + const [x0, y0] = this.dungeonTopLeft + + const offsetSize = Math.floor(this.widthRoomImageMap/2) + 1 + // [dx, dy, dx1, dy1, horizontal] where dx is on-axis with the center of the room, and dx1 is offset slightly + // if dx exists and dx1 doesn't, then there is a door here, not a room extension. + const directions = [ + [0, -offsetSize, 5, -offsetSize, false], + [offsetSize, 0, offsetSize, 5, true], + [0, offsetSize, -5, offsetSize, false], + [-offsetSize, 0, -offsetSize, -5, true], + ] + + for (let component of this.roomComponentArray) { + let dx = component.arrayX + let dy = component.arrayY + let cornerX = x0 + this.roomAndDoorWidth * dx + let cornerY = y0 + this.roomAndDoorWidth * dy + + let roomColor = mapColors[cornerX + cornerY * 128] + if (!roomColor || !(roomColor in roomColors)) continue // Nothing here! or room color unknown + + let roomCenterX = cornerX + Math.floor(this.widthRoomImageMap / 2) + let roomCenterY = cornerY + Math.floor(this.widthRoomImageMap / 2) + let checkColor = mapColors[roomCenterX + roomCenterY * 128] + + // ChatLib.chat(`Checking ${component.arrayX}, ${component.arrayY}`) + + let room = this.getRoomAtComponent(component) + + let newType = roomColors[roomColor] + let newCheck = checkColor in checkmarkColors ? checkmarkColors[checkColor] : Checkmark.NONE + + if (!room) { + room = new Room(this, newType, [component]) + room.checkmarkState = newCheck + // ChatLib.chat(`&bCreated new room &3${room}`) + this.addRoom(room) + } - // Special room at that location - let position = new Position(0, 0, this) - position.mapX = mapX - position.mapY = mapY - let currRoom = this.rooms.get(x + "," + y) - if (!currRoom) { - let room = new Room(this, roomColors[pixelColor], [position], undefined) - this.rooms.set(x + "," + y, room) - this.roomsArr.add(room) - room.checkmarkState = room.type === Room.UNKNOWN ? Room.ADJACENT : Room.OPENED - this.markChanged() - } - else { - if (currRoom.type !== roomColors[pixelColor] && !currRoom.roomId) { - currRoom.setType(roomColors[pixelColor]) - currRoom.checkmarkState = currRoom.type === Room.UNKNOWN ? Room.ADJACENT : Room.OPENED - this.markChanged(); - } - if (currRoom.checkmarkState === Room.ADJACENT && currRoom.type !== Room.UNKNOWN && roomColors[pixelColor] !== Room.UNKNOWN) { - currRoom.checkmarkState = Room.OPENED - this.markChanged(); - } - } - } - if (pixelColor === 63) { - // Normal room at that location - let position = new Position(0, 0, this) - position.mapX = mapX - position.mapY = mapY - let currRoom = this.rooms.get(x + "," + y) - - // Current rooms to the left and above, incase a merge needs to happen - // Will be undefined if no merge needs to happen - let currRoomLeft = mapColors[(mapX - 1) + (mapY) * 128] === 63 ? this.rooms.get((x - 1) + "," + y) : undefined - let currRoomTop = mapColors[(mapX) + (mapY - 1) * 128] === 63 ? this.rooms.get(x + "," + (y - 1)) : undefined - let currRoomTopRight = mapColors[(mapX + this.roomAndDoorWidth - 1) + (mapY) * 128] === 63 && mapColors[(mapX + this.roomAndDoorWidth) + (mapY - 1) * 128] === 63 ? this.rooms.get((x + 1) + "," + (y - 1)) : undefined - - if (!currRoom && !currRoomLeft && !currRoomTop && !currRoomTopRight) { // No room and no merge - let room = new Room(this, Room.NORMAL, [position], undefined) - this.rooms.set(x + "," + y, room) - this.roomsArr.add(room) - this.markChanged() - } - // Already a normal room either in same location, or needs to merge up or left - else { - if (currRoom && currRoom.checkmarkState === Room.ADJACENT) { - currRoom.checkmarkState = Room.OPENED - this.markChanged(); - } - // Another room in the same location - if (currRoom && currRoom.type !== Room.NORMAL) { - currRoom.setType(Room.NORMAL) - currRoom.checkmarkState = Room.OPENED - this.markChanged() - } - // Need to merge left - if (currRoomLeft && currRoom !== currRoomLeft && currRoomLeft.type === Room.NORMAL && !currRoomLeft.components.some(a => position.equals(a))) { - if (currRoom) this.roomsArr.delete(currRoom) - currRoomLeft.addComponents(position) - this.rooms.set(x + "," + y, currRoomLeft) - this.markChanged() - } - // Need to merge up - if (currRoomTop && currRoom !== currRoomTop && currRoomTop.type === Room.NORMAL && !currRoomTop.components.some(a => position.equals(a))) { - if (currRoom) this.roomsArr.delete(currRoom) - currRoomTop.addComponents(position) - this.rooms.set(x + "," + y, currRoomTop) - this.markChanged() - } - // Need to merge up - if (currRoomTopRight && currRoom !== currRoomTopRight && currRoomTopRight.type === Room.NORMAL && !currRoomTopRight.components.some(a => position.equals(a))) { - if (currRoom) this.roomsArr.delete(currRoom) - currRoomTopRight.addComponents(position) - this.rooms.set(x + "," + y, currRoomTopRight) - this.markChanged() - } - } - } + // White, green, failed checkmarks + if (newCheck !== Checkmark.GRAY && newCheck !== room.checkmarkState && newCheck !== Checkmark.NONE) { + room.checkmarkState = newCheck + this.markChanged() + } - // Check for checkmark - let roomCenter = mapColors[(mapX + this.widthRoomImageMap / 2) + (mapY + this.widthRoomImageMap / 2) * 128] - let checkmarkPos = new Position(0, 0, this) - checkmarkPos.mapX = mapX - checkmarkPos.mapY = mapY - let checkmarkRoom = this.rooms.get(checkmarkPos.arrayX + "," + checkmarkPos.arrayY) - // White tick - if (roomCenter === 34 && checkmarkRoom && checkmarkRoom.checkmarkState !== Room.CLEARED) { - checkmarkRoom.checkmarkState = Room.CLEARED - this.markChanged() - } - // Green tick - if (roomCenter === 30 && checkmarkRoom.checkmarkState !== Room.COMPLETED) { - checkmarkRoom.checkmarkState = Room.COMPLETED - checkmarkRoom.currentSecrets = checkmarkRoom.maxSecrets - this.markChanged() - } - // Red X - if (roomCenter === 18 && checkmarkRoom && checkmarkRoom.checkmarkState !== Room.FAILED && checkmarkRoom.type !== Room.BLOOD) { - checkmarkRoom.checkmarkState = Room.FAILED - this.markChanged() - } + // Room type changed + if (newType !== room.type && newType !== Room.UNKNOWN) { + room.type = newType - // Check for doors + if (newType == Room.PUZZLE && !room.data) this.unknownPuzzles.add(room) + + this.markChanged() + } - if (mapColors[(mapX + this.widthRoomImageMap / 2) + (mapY - 1) * 128] !== 0 // Door above room - && mapColors[(mapX) + (mapY - 1) * 128] === 0) { + // Room went from unopened to opened, get rid of the gray checkmark + if (room.checkmarkState == Checkmark.GRAY && newType !== Room.UNKNOWN) { + room.checkmarkState = Checkmark.NONE + this.markChanged() + } - let color = mapColors[(mapX + this.widthRoomImageMap / 2) + (mapY - 1) * 128] - let type = Room.NORMAL - if (color in roomColors) type = roomColors[color] - if (color === 119) type = Room.BLACK + // Branch outwards looking for doors and new rooms + for (let dir of directions) { + let [dx, dy, dx1, dy1, horizontal] = dir + let axisColor = mapColors[roomCenterX + dx + (roomCenterY + dy)*128] + let offsetColor = mapColors[roomCenterX + dx1 + (roomCenterY + dy1)*128] - let position = new Position(0, 0, this) - position.mapX = mapX + this.widthRoomImageMap / 2 - 1 - position.mapY = mapY - 3 + if (!axisColor || !(axisColor in roomColors)) continue // Nothing here - position.worldX = Math.round(position.worldX) - position.worldY = Math.round(position.worldY) - let door = this.doors.get(position.arrayX + "," + position.arrayY) + let doorType = roomColors[axisColor] - if (door && door.type !== type) { - // Door already exists, update it. - door.type = type - if (type === Room.BLACK || type === Room.BLOOD) this.witherDoors.add(door) - else this.witherDoors.delete(door) - this.markChanged() - } - if (!door) { - // Door not in map, add new door - let newDoor = new Door(type, position, false) - this.doors.set(position.arrayX + "," + position.arrayY, newDoor) - this.addDoorToAdjacentRooms(newDoor); - if (type === Room.BLACK || type === Room.BLOOD) this.witherDoors.add(newDoor) + // Door should go here! + if (axisColor && !offsetColor) { + let worldX = component.worldX + Math.sign(dx) * 16 + let worldZ = component.worldY + Math.sign(dy) * 16 + let position = new Position(worldX, worldZ, this) + // Check if door exists, and update its type (For wither doors) + let existingDoor = this.doors.get(position.arrayStr) + if (existingDoor) { + // Wither door was opened + if (existingDoor.type == Room.BLACK && doorType !== Room.BLACK) { + this.witherDoors.delete(existingDoor) + } + if (doorType !== Room.UNKNOWN) existingDoor.type = doorType this.markChanged() + continue } - } - - if (mapColors[(mapX - 1) + (mapY + this.widthRoomImageMap / 2) * 128] !== 0 // Door left of room - && mapColors[(mapX - 1) + (mapY) * 128] === 0) { + + let door = new Door(doorType, position, horizontal) + this.addDoor(door) + if (door.type == Room.BLACK) this.witherDoors.add(door) - let color = mapColors[(mapX - 1) + (mapY + this.widthRoomImageMap / 2) * 128] + continue + } - let type = Room.NORMAL - if (color in roomColors) type = roomColors[color] - if (color === 119) type = Room.BLACK + // Room extension, no door + let newWorldX = component.worldX + Math.sign(dx) * 32 + let newWorldZ = component.worldY + Math.sign(dy) * 32 + let newComponent = this.getComponentAt(newWorldX, newWorldZ) - let position = new Position(0, 0, this) - position.mapX = mapX - 3 - position.mapY = mapY + this.widthRoomImageMap / 2 - 1 + if (!newComponent) continue + + let existingRoom = this.getRoomAtComponent(newComponent) - position.worldX = Math.round(position.worldX) - position.worldY = Math.round(position.worldY) + // This extension is already part of this room + if (existingRoom && existingRoom == room) continue - if (!this.doors.get(position.arrayX + "," + position.arrayY)) { - // Door not in map, add new door - let door = new Door(type, position, true) - this.doors.set(position.arrayX + "," + position.arrayY, door); - this.addDoorToAdjacentRooms(door); - if (type === Room.BLACK || type === Room.BLOOD) this.witherDoors.add(door) - this.markChanged() - } - else { - // Door already there - let door = this.doors.get(position.arrayX + "," + position.arrayY) - if (door.type !== type) { - door.type = type - if (type === Room.BLACK || type === Room.BLOOD) { this.witherDoors.add(door) } - else { this.witherDoors.delete(door) } - this.markChanged() - } - } + if (!existingRoom) { + room.addComponent(newComponent) + this.markChanged() + continue } + + this.mergeRooms(existingRoom, room) + continue } } } updatePuzzles() { - let puzzleNamesList = []; - let identifiedPuzzleList = []; - if (!TabList) return; + if (!this.unknownPuzzles.size) return + // let puzzleNames = [] + if (!TabList) return + let names = [] try { names = TabList.getNames() // Sometimes this has a null pointer exception inside the function? @@ -825,51 +1111,38 @@ class DungeonMap { } const puzStart = names.findIndex(a => a.removeFormatting().match(/^Puzzles: \(\d+\)$/)) if (puzStart == -1) return + + const replacements = { + "Higher Or Lower": "Blaze" + } + + let unknownPuzArr = [...this.unknownPuzzles] + // The five lines after the "Puzzles: (3)" line const puzLines = names.slice(puzStart + 1, puzStart + 6).map(a => a.removeFormatting()) puzLines.forEach(line => { // https://regex101.com/r/qhNs78/1 let match = line.match(/^ ([\w? ]+)+: \[(.)\] (?:\(.+\))?$/) if (!match) return + let [_, name, status] = match if (name == "???") return - puzzleNamesList.push(name) - if (status !== "✖") return + if (name in replacements) name = replacements[name] + + let found = false for (let room of this.roomsArr) { - if (room.data?.name?.toLowerCase() !== name.toLowerCase()) continue - room.checkmarkState = Room.FAILED + // This puzzle has already been identified + if (room.name == name) { + found = true + break + } } - }); - let puzzleCount = 0 - this.roomsArr.forEach((room) => { - if (room.type === Room.PUZZLE && room.checkmarkState !== Room.ADJACENT) { - if (room.roomId) - identifiedPuzzleList.push(room.data?.name?.toLowerCase() || '???'); - puzzleCount++; + if (!found) { + let identifiedPuz = unknownPuzArr.shift() + identifiedPuz.name = name + this.unknownPuzzles.delete(identifiedPuz) } }) - if (puzzleNamesList.length <= this.identifiedPuzzleCount) { - return - }; - if (puzzleNamesList.length != puzzleCount) { - return; - } - puzzleNamesList = puzzleNamesList.filter(e => !identifiedPuzzleList.includes(e.toLowerCase())); - for (let i = 0; i < 6; i++) { - for (let j = 0; j < 6; j++) { - let coords = i + ',' + j; - let room = this.rooms.get(coords); - if (!room) continue; - if (room.type == Room.PUZZLE && !room.roomId) { - let puzzleName = puzzleNamesList.shift(); - if (!puzzleName) continue; - let ids = DungeonRoomData.getRoomIdsFromName(puzzleName) - room.roomId = ids[0]; - this.identifiedRoomIds.addAll(...ids); - } - } - } - this.identifiedPuzzleCount = puzzleNamesList.length; } /** @@ -880,7 +1153,11 @@ class DungeonMap { if (Date.now() - this.cachedScore.time < 500) return this.cachedScore.data let exploration = 0; - let time = 100; // TODO: Figure out how to actually do this one + + let time = 12; + let floortime = 0; + let runtime = 0; + let skill = 0; let bonus = 0; @@ -901,7 +1178,39 @@ class DungeonMap { exploration += Math.min(60, ~~(completedRooms / totalRoomEstimate * 60)); // Time - // NOPE + // Community wiki is maybe wrong and there is no article on the official one, + // so the score is calculated in the same way Skytils dose it. + // https://github.com/Skytils/SkytilsMod/blob/1.x/src/main/kotlin/gg/skytils/skytilsmod/features/impl/dungeons/ScoreCalculation.kt#L168 + runtime = Math.round(Date.now() / 1000 - this.dungeonStart) + + if (this.floor == "F6" || this.floor == "F4") { + floortime = runtime - 240 + } else if (this.floor == "F7" || this.floor == "M7") { + floortime = runtime - 360 + } else if (this.floorNumber >= 3 || this.floor == "F5" || this.floor == "M6") { + floortime = runtime - 120 + } else if (this.floor == "M1" || this.floor == "M2" || this.floor == "M3" || this.floor == "M4" || this.floor == "M5") { + floortime = runtime + } + + if (floortime < 480) { + time = 100 + } else if (floortime >= 480 && floortime < 600) { + time = 140 - floortime/12 + } else if (floortime >= 600 && floortime < 840) { + time = 115 - floortime/24 + } else if (floortime >= 840 && floortime < 1140) { + time = 108 - floortime/30 + } else if (floortime >= 1140 && floortime < 3940) { + time = 98.5 - floortime/40 + } else { + time = 0 + } + + if (this.dungeonStart < 1700000000) { // For example if BetterMap is reloaded, or if something just breaks. + time = 100 + } + time = Math.round(time) // Skill skill += ~~(completedRooms / totalRoomEstimate * 80) - unfinshedPuzzles * 10; @@ -972,73 +1281,55 @@ class DungeonMap { return this.cachedScore.data } - /** - * Gets the current room the player is standing in - * @returns {Room} - */ - getPlayerRoom() { - let x = ~~((Player.getX() + dungeonOffsetX) / 32); - let y = ~~((Player.getZ() + dungeonOffsetY) / 32); - - return this.rooms.get(x + ',' + y); - } - scanFirstDeathForSpiritPet(username) { - if (this.firstDeath) return - this.firstDeath = true - - if (!this.nameToUuid[username.toLowerCase()]) return - let uuid = this.nameToUuid[username.toLowerCase()]?.replace(/-/g, "") + if (this.firstDeath) return; + this.firstDeath = true; - let apiKey = settings.settings.apiKey + if (!this.nameToUuid[username.toLowerCase()]) return; + let uuid = this.nameToUuid[username.toLowerCase()]?.replace(/-/g, ""); const printSpiritMessage = () => { - if (this.firstDeathHadSpirit) return ChatLib.chat(`${MESSAGE_PREFIX}${username} ${username == "You" ? "do" : "does"} have a spirit pet.`) - ChatLib.chat(`${MESSAGE_PREFIX}${username} ${username == "You" ? "do" : "does"} not have a spirit pet.`) - } + if (this.firstDeathHadSpirit) return ChatLib.chat(`${MESSAGE_PREFIX}${username} ${username == "You" ? "do" : "does"} have a spirit pet.`); + ChatLib.chat(`${MESSAGE_PREFIX}${username} ${username == "You" ? "do" : "does"} not have a spirit pet.`); + }; - if (apiKey) { - fetch(`https://api.hypixel.net/skyblock/profiles?key=${apiKey}&uuid=${uuid}`).json(data => { - if (!data.success) return - let latestProfile = data.profiles.find(a => a.selected) - if (!latestProfile) return // This shouldn't happen - this.firstDeathHadSpirit = latestProfile.members[uuid].pets.some(pet => pet.type === "SPIRIT" && pet.tier === "LEGENDARY") - printSpiritMessage() - }) - } - else { - // Works without api key, api key still recommended though for secrets tracking - fetch(`https://soopy.dev/api/v2/player_skyblock/${uuid}`).json(data => { - if (!data.success) return - this.firstDeathHadSpirit = data.data.profiles[data.data.stats.currentProfileId].members[uuid].pets.some(pet => pet.type === "SPIRIT" && pet.tier === "LEGENDARY") - printSpiritMessage() - }) - } + fetch(`https://api.tenios.dev/spiritPet/${uuid}`).json((spirit) => { + this.firstDeathHadSpirit = spirit + printSpiritMessage(); + }); } - secretCountActionBar(min, max) { - if (!this.canUpdateRoom()) return - let x = ~~((Player.getX() + dungeonOffsetX) / 32); - let y = ~~((Player.getZ() + dungeonOffsetY) / 32); + canUpdateRoom() { + return Date.now() - this.lastRoomChange > 1500 + } - let currentRoom = this.rooms.get(x + ',' + y); + secretCountActionBar(found, total) { + if (!this.canUpdateRoom()) return + let currentRoom = this.getCurrentRoom() if (!currentRoom || currentRoom.type === Room.UNKNOWN) return; // Current room not loaded yet - if (currentRoom.currentSecrets !== min && (currentRoom.maxSecrets === max || !currentRoom.roomId)) { - currentRoom.currentSecrets = min - currentRoom.maxSecrets = max - if (currentRoom.checkmarkState === Room.CLEARED && currentRoom.currentSecrets >= currentRoom.maxSecrets) currentRoom.checkmarkState = Room.COMPLETED; - this.markChanged() // Re-render map incase of a secret count specific texturing + // Secret count is already updated for this room + if (currentRoom.currentSecrets == found && currentRoom.maxSecrets == total) return - this.sendSocketData({ - type: 'roomSecrets', - min, - max, - x, - y - }) - } + currentRoom.maxSecrets = total + currentRoom.currentSecrets = found + + if (currentRoom.checkmarkState === Room.CLEARED && currentRoom.currentSecrets >= currentRoom.maxSecrets) currentRoom.checkmarkState = Room.COMPLETED; + + this.markChanged() // Re-render map incase of a secret count specific texturing + + const currentComponent = this.getComponentAt(Player.getX(), Player.getZ()) + const x = currentComponent.arrayX + const y = currentComponent.arrayY + + this.sendSocketData({ + type: 'roomSecrets', + min: found, + max: total, + x, + y + }) } /** @@ -1048,92 +1339,63 @@ class DungeonMap { * @param {Number} z */ toRelativeCoords(x, y, z) { - let px = ~~((x + dungeonOffsetX) / 32); - let py = ~~((z + dungeonOffsetY) / 32); - let room = this.rooms.get(px + ',' + py); + let room = this.getRoomAt(x, z) if (!room) return null; + return room.getRelativeCoords(x, y, z); } getCurrentRoom() { - let x = ~~((Player.getX() + dungeonOffsetX) / 32); - let y = ~~((Player.getZ() + dungeonOffsetY) / 32); - - return this.rooms.get(x + ',' + y); - } - - identifyCurrentRoom() { - if (!this.canUpdateRoom()) return - let x = ~~((Player.getX() + dungeonOffsetX) / 32); - let y = ~~((Player.getZ() + dungeonOffsetY) / 32); - - let roomId = this.getCurrentRoomId(); - - if (!roomId) return; // Room id not loaded or inbetween 2 rooms - if (this.identifiedRoomIds.has(roomId)) return; // Already loaded room - - let currentRoom = this.rooms.get(x + ',' + y); - - if (!currentRoom || currentRoom.roomId || currentRoom.type === Room.UNKNOWN) return; // Current room not loaded yet, or already loaded id - - currentRoom.roomId = roomId; - this.identifiedRoomIds.add(roomId); - - this.markChanged() // Re-render map incase of a room-id specific texturing - - this.sendSocketData({ - type: "roomId", - x, y, roomId - }) + return this.getRoomAt(Player.getX(), Player.getZ()) } roomGuiClicked(context, cursorX, cursorY, button, isPress) { - if (!isPress) return + // if (!isPress) return - if (this.dropdownXY) { - dungeonMapButtons.forEach(([name, callback], index) => { + // if (this.dropdownXY) { + // dungeonMapButtons.forEach(([name, callback], index) => { - let bx = this.dropdownXY[0] + 1 - let by = this.dropdownXY[1] + 25 * index + 1 - let bw = 73 - let bh = 23 + // let bx = this.dropdownXY[0] + 1 + // let by = this.dropdownXY[1] + 25 * index + 1 + // let bw = 73 + // let bh = 23 - let hovered = cursorX >= bx && cursorX <= bx + bw && cursorY >= by && cursorY <= by + bh + // let hovered = cursorX >= bx && cursorX <= bx + bw && cursorY >= by && cursorY <= by + bh - if (hovered) { - callback(this, this.dropdownXY[2]) - } - }) - this.dropdownXY = undefined - return - } + // if (hovered) { + // callback(this, this.dropdownXY[2]) + // } + // }) + // this.dropdownXY = undefined + // return + // } - if (button === 1) { // Right click -> store x, y and render even if chat not open - this.dropdownXY = undefined - if (this.cursorStoreXY) this.cursorStoreXY = undefined - else this.cursorStoreXY = [cursorX, cursorY] - return - } + // if (button === 1) { // Right click -> store x, y and render even if chat not open + // this.dropdownXY = undefined + // if (this.cursorStoreXY) this.cursorStoreXY = undefined + // else this.cursorStoreXY = [cursorX, cursorY] + // return + // } - let { x, y, size } = context.getMapDimensions(); - const borderPixels = 27 / 256 * size; - if (cursorX < x + borderPixels || cursorY < y + borderPixels || cursorX > x + size - borderPixels || cursorY > y + size - borderPixels) return; + // let { x, y, size } = context.getMapDimensions(); + // const borderPixels = 27 / 256 * size; + // if (cursorX < x + borderPixels || cursorY < y + borderPixels || cursorX > x + size - borderPixels || cursorY > y + size - borderPixels) return; - // Mouse somewhere on map - let worldX = (((cursorX - x - context.borderWidth) / context.size * context.getImageSize(this.floor) - context.paddingLeft - context.roomSize / 2 - context.roomGap / 2) / context.blockSize + 0.5) * 32 - 200 - let worldY = (((cursorY - y - context.borderWidth) / context.size * context.getImageSize(this.floor) - context.paddingTop - context.roomSize / 2 - context.roomGap / 2) / context.blockSize + 0.5) * 32 - 200 + // // Mouse somewhere on map + // let worldX = (((cursorX - x - context.borderWidth) / context.size * context.getImageSize(this.floor) - context.paddingLeft - context.roomSize / 2 - context.roomGap / 2) / context.blockSize + 0.5) * 32 - 200 + // let worldY = (((cursorY - y - context.borderWidth) / context.size * context.getImageSize(this.floor) - context.paddingTop - context.roomSize / 2 - context.roomGap / 2) / context.blockSize + 0.5) * 32 - 200 - let coordsX = ~~((worldX + 200) / 32) - let coordsY = ~~((worldY + 200) / 32) + // let coordsX = ~~((worldX + 200) / 32) + // let coordsY = ~~((worldY + 200) / 32) - if (!this.rooms.has(coordsX + ',' + coordsY)) return // No room at mouse + // if (!this.rooms.has(coordsX + ',' + coordsY)) return // No room at mouse - let room = this.rooms.get(coordsX + ',' + coordsY); // Hovered room + // let room = this.rooms.get(coordsX + ',' + coordsY); // Hovered room - if (button !== 0) return // Ignore buttons like middle mouse + // if (button !== 0) return // Ignore buttons like middle mouse - this.dropdownXY = [cursorX + 8, cursorY - 16, room] - this.cursorStoreXY = undefined + // this.dropdownXY = [cursorX + 8, cursorY - 16, room] + // this.cursorStoreXY = undefined } @@ -1175,13 +1437,15 @@ class DungeonMap { if (((worldX + 200) / 32) < 0) return if (((worldY + 200) / 32) < 0) return - let coordsX = ~~((worldX + 200) / 32) - let coordsY = ~~((worldY + 200) / 32) + // const [coordsX, coordsY] = getComponentFromPos(worldX, worldY) + // const component = this.getComponentAt(worldX, worldZ) + const room = this.getRoomAt(worldX, worldY) + if (!room) return // No room at mouse - if (!this.rooms.has(coordsX + ',' + coordsY)) return + // if (!this.rooms.has(component)) return - let room = this.rooms.get(coordsX + ',' + coordsY); + // let room = this.rooms.get(component); let roomLore = room.getLore() @@ -1189,431 +1453,26 @@ class DungeonMap { } - canUpdateRoom() { - let currRoom = this.getRoomXYWorld().join(",") - if (this.roomXY !== currRoom) { - this.roomXY = currRoom - this.lastChange = Date.now() // Add delay between checking for rooms if switch room - } - return Date.now() - this.lastChange > 1000 - } - - // ============================== - // UPDATING FROM WORLD CODE - // ============================== - updateFromWorld() { - let roomid = this.getCurrentRoomId() - if (!roomid) return // No roomid eg inbetween 2 rooms - if (!this.getCurrentRoomData()) return - - let x = Math.floor((Player.getX() + 8) / 32) * 32 - 9 // Top left of current 1x1 that players in - let y = Math.floor((Player.getZ() + 8) / 32) * 32 - 9 - - let playerMapX = ~~((Player.getX() + 200) / 32); - let playerMapY = ~~((Player.getZ() + 200) / 32); - let currentRoom = this.rooms.get(playerMapX + ',' + playerMapY); - - if (!currentRoom || !currentRoom.roomId || currentRoom.type === Room.UNKNOWN) { // Current room not already identified - if (roomid !== this.lastRoomId && this.canUpdateRoom()) { // Room id changed, check current room - this.lastRoomId = roomid - - let roomWorldData = this.getRoomWorldData() - - let rotation = roomWorldData.width > roomWorldData.height ? 0 : 1 - - // L shape rooms only rooms that 'need' rotation all others can be 0 -> horizontal or 1-> verticle - - if (this.getCurrentRoomData().shape === "L") rotation = roomWorldData.rotation - if (this.getCurrentRoomData().type === "spawn") { - roomWorldData.x = x + 1 - roomWorldData.y = y + 1 - - this.setAirLocs.add((x - 1) + "," + (y - 1)) - this.setAirLocs.add((x) + "," + (y - 1)) - this.setAirLocs.add((x - 1) + "," + (y)) - - this.setAirLocs.add((x + 32) + "," + (y - 1)) - this.setAirLocs.add((x + 32 - 1) + "," + (y - 1)) - this.setAirLocs.add((x + 32) + "," + (y)) - - this.setAirLocs.add((x - 1) + "," + (y + 32)) - this.setAirLocs.add((x - 1) + "," + (y - 1 + 32)) - this.setAirLocs.add((x) + "," + (y + 32)) - - this.setAirLocs.add((x + 32) + "," + (y + 32)) - this.setAirLocs.add((x + 32 - 1) + "," + (y + 32)) - this.setAirLocs.add((x + 32) + "," + (y - 1 + 32)) - } - - this.setRoom(roomWorldData.x, roomWorldData.y, rotation, roomid, true) - this.identifiedRoomIds.add(roomid); - } - } - - - if (this.lastXY !== x + "," + y) { - this.lastXY = x + "," + y - - // Checking for doors on all sides of room - if (this.getBlockAt(x + 16, 73, y)) this.setDoor(x + 16, y, 0, true) - if (this.getBlockAt(x, 73, y + 16)) this.setDoor(x, y + 16, 1, true) - if (this.getBlockAt(x + 16, 73, y + 32)) this.setDoor(x + 16, y + 32, 0, true) - if (this.getBlockAt(x + 32, 73, y + 16)) this.setDoor(x + 32, y + 16, 1, true) - } - } - setRoom(x, y, rotation, roomId, locallyFound) { - if (!roomId) return - if (locallyFound) { - if (this.identifiedRoomIds.has(roomId)) return - this.identifiedRoomIds.add(roomId); - } - - let coordsX = ~~((x + 200) / 32) - let coordsY = ~~((y + 200) / 32) - - let locstr = coordsX + "," + coordsY - - let roomData = DungeonRoomData.getDataFromId(roomId) - let type = Room.NORMAL - - const types = { - "mobs": Room.NORMAL, - "miniboss": Room.NORMAL, - "rare": Room.NORMAL, - "spawn": Room.SPAWN, - "puzzle": Room.PUZZLE, - "gold": Room.MINIBOSS, - "fairy": Room.FAIRY, - "blood": Room.BLOOD, - "trap": Room.TRAP - } - if (roomData.type in types) type = types[roomData.type] - - let components = [] - - switch (roomData.shape) { // Add room components based on shape - case "1x1": - components.push(new Position(x, y)) - break - case "1x2": - components.push(new Position(x, y)) - if (rotation === 0) { - components.push(new Position(x + 32, y)) - } - else { - components.push(new Position(x, y + 32)) - } - break - case "1x3": - components.push(new Position(x, y)) - if (rotation === 0) { - components.push(new Position(x + 32, y)) - components.push(new Position(x + 64, y)) - } - else { - components.push(new Position(x, y + 32)) - components.push(new Position(x, y + 64)) - } - break - case "1x4": - components.push(new Position(x, y)) - if (rotation === 0) { - components.push(new Position(x + 32, y)) - components.push(new Position(x + 64, y)) - components.push(new Position(x + 96, y)) - } - else { - components.push(new Position(x, y + 32)) - components.push(new Position(x, y + 64)) - components.push(new Position(x, y + 96)) - } - break - case "2x2": - components.push(new Position(x, y)) - components.push(new Position(x + 32, y)) - components.push(new Position(x, y + 32)) - components.push(new Position(x + 32, y + 32)) - break - case "L": - if (rotation !== 2) components.push(new Position(x, y)) - if (rotation !== 1) components.push(new Position(x, y + 32)) - if (rotation !== 3) components.push(new Position(x + 32, y)) - if (rotation !== 0) components.push(new Position(x + 32, y + 32)) - //top left isnt inside of the L room - if (rotation === 2) locstr = x + ',' + (y + 32); - break - } - - let room = this.rooms.get(locstr); - if (room) { // Already a room there - room = this.rooms.get(locstr) - room.setType(type) - room.components = components - room.rotation = room.findRotation(); - room.roomId = roomId - } else { - room = new Room(this, type, components, roomId) - } - - room.checkmarkState = 1 - - room.components.forEach(c => { - this.roomsArr.delete(this.rooms.get(c.arrayX + "," + c.arrayY)) - this.rooms.set(c.arrayX + "," + c.arrayY, room) - }) - this.roomsArr.add(room) - this.markChanged() - - if (locallyFound) { - this.sendSocketData({ - type: "roomLocation", - x, y, rotation, roomId - }) - } - } - - setDoor(x, y, ishorizontal, locallyFound, type = -1) { - let rx = x - 4 // Offset xy of room placed in world so it matches nicely with rendering - let ry = y - 4 - let pos = new Position(rx, ry); - if (this.doors.get(pos.arrayX + "," + pos.arrayY)) return // Already door loaded there - let id = World.getBlockAt(new BlockPos(x, 69, y)).type.getID() //get type of door - - if (type === -1) { - if (id === 0) type = Room.UNKNOWN - else if (id === 97) type = Room.NORMAL - else if (id === 173) type = Room.BLACK - else if (id === 159) type = Room.BLOOD - else return // Return if door issnt made of those blocks (maby its not actually a door, eg back of green room) - } - - if (ishorizontal) { - { - // Add Room.UNKNOWN to the right if needed - - let x2 = Math.floor((x + 15 + 8) / 32) * 32 - 8 - let y2 = Math.floor((y + 8) / 32) * 32 - 8 - - let mapCoordX = ~~((x2 + dungeonOffsetX) / 32); - let mapCoordY = ~~((y2 + dungeonOffsetY) / 32); - - if (!this.rooms.get(mapCoordX + "," + mapCoordY)) { - let room = new Room(this, Room.UNKNOWN, [new Position(x2, y2)], undefined) - room.checkmarkState = 1 // 1 -> adjacent/not opened - this.rooms.set(mapCoordX + "," + mapCoordY, room) - this.roomsArr.add(room) - } - } - { - // Add Room.UNKNOWN to the left if needed - - let x2 = Math.floor((x - 15 + 8) / 32) * 32 - 8 - let y2 = Math.floor((y + 8) / 32) * 32 - 8 - - let mapCoordX = ~~((x2 + dungeonOffsetX) / 32); - let mapCoordY = ~~((y2 + dungeonOffsetY) / 32); - - if (!this.rooms.get(mapCoordX + "," + mapCoordY)) { - let room = new Room(this, Room.UNKNOWN, [new Position(x2, y2)], undefined) - room.checkmarkState = 1// 1 -> adjacent/not opened - this.rooms.set(mapCoordX + "," + mapCoordY, room) - this.roomsArr.add(room) - } - } - } - else { - { - // Add Room.UNKNOWN to the top if needed - - let x2 = Math.floor((x + 8) / 32) * 32 - 8 - let y2 = Math.floor((y + 15 + 8) / 32) * 32 - 8 - - let mapCoordX = ~~((x2 + dungeonOffsetX) / 32); - let mapCoordY = ~~((y2 + dungeonOffsetY) / 32); - - if (!this.rooms.get(mapCoordX + "," + mapCoordY)) { - let room = new Room(this, Room.UNKNOWN, [new Position(x2, y2)], undefined) - room.checkmarkState = 1// 1 -> adjacent/not opened - this.rooms.set(mapCoordX + "," + mapCoordY, room) - this.roomsArr.add(room) - } - } - { - // Add Room.UNKNOWN to the bottom if needed - - let x2 = Math.floor((x + 8) / 32) * 32 - 8 - let y2 = Math.floor((y - 15 + 8) / 32) * 32 - 8 - - let mapCoordX = ~~((x2 + dungeonOffsetX) / 32); - let mapCoordY = ~~((y2 + dungeonOffsetY) / 32); - - if (!this.rooms.get(mapCoordX + "," + mapCoordY)) { - let room = new Room(this, Room.UNKNOWN, [new Position(x2, y2)], undefined) - room.checkmarkState = 1// 1 -> adjacent/not opened - this.rooms.set(mapCoordX + "," + mapCoordY, room) - this.roomsArr.add(room) - } - } - } - - let door = new Door(type, pos, ishorizontal) - this.addDoorToAdjacentRooms(door); - this.doors.set(pos.arrayX + "," + pos.arrayY, door) - if (type === Room.BLACK || type === Room.BLOOD) { this.witherDoors.add(door) } - else { this.witherDoors.delete(door) } - this.markChanged() - - if (locallyFound) { - this.sendSocketData({ - type: "doorLocation", - x, y, ishorizontal, doorType: type - }) - } - } - - /** - * NOTE: check for roomid is falsy before using - * @returns {String} the current room id - */ - getCurrentRoomId() { - if (Scoreboard.getLines().length === 0) return undefined - let id = Scoreboard.getLineByIndex(Scoreboard.getLines().length - 1).getName().trim().split(" ").pop() - - if (!id.includes(",")) return undefined // Not id, eg id not on scoreboard - - return id - } - - /** - * @returns {[Number, Number]} the x and y location of the rooms 'location' (top left of all rooms, shifting down by 1 if needed to in L) - */ - getRoomXYWorld() { - let roomData = this.getRoomWorldData() - if (roomData.rotation === 4) return [roomData.x, roomData.y + 32] - return [roomData.x, roomData.y] - } - getCurrentRoomData() { - let id = this.getCurrentRoomId() - if (!id) return undefined// No room id - return DungeonRoomData.getDataFromId(id) - } - - getRotation(x, y, width, height, roofY) { - let currRoomData = this.getCurrentRoomData() - if (!currRoomData) return -1 - - if (currRoomData.shape !== "L") { - if (this.getTopBlockAt(x, y, roofY) === 11) return 0 - if (this.getTopBlockAt(x + width, y, roofY) === 11) return 1 - if (this.getTopBlockAt(x + width, y + height, roofY) === 11) return 2 - if (this.getTopBlockAt(x, y + height, roofY) === 11) return 3 - } - else { - let one = this.getTopBlockAt2(x + width / 2 + 1, y + height / 2, roofY) - let two = this.getTopBlockAt2(x + width / 2 - 1, y + height / 2, roofY) - let three = this.getTopBlockAt2(x + width / 2, y + height / 2 + 1, roofY) - let four = this.getTopBlockAt2(x + width / 2, y + height / 2 - 1, roofY) - - if (one === 0 && three === 0) return 0 - if (two === 0 && three === 0) return 1 - if (one === 0 && four === 0) return 3 - if (two === 0 && four === 0) return 2// 3 IS SO TOXIK HGOLY HEL I HATE L SHAPE ROOMS WHY DO THIS TO ME - } + const room = this.getCurrentRoom() + if (!room) return null - return -1 - } - - getBlockIdAt(x, y, z) { - if (this.setAirLocs?.has(x + "," + z)) return 0 - - return World.getBlockAt(new BlockPos(x, y, z)).type.getID() - } - - getRoomWorldData() { - let x = Math.floor((Player.getX() + 8) / 32) * 32 - 8 - let y = Math.floor((Player.getZ() + 8) / 32) * 32 - 8 - let width = 30 - let height = 30 - - let roofY = this.getRoofAt(x, y) - - while (this.getBlockIdAt(x - 1, roofY, y) !== 0) { - x -= 32 - width += 32 - } - while (this.getBlockIdAt(x, roofY, y - 1) !== 0) { - y -= 32 - height += 32 - } - while (this.getBlockIdAt(x - 1, roofY, y) !== 0) { // Second iteration incase of L shape - x -= 32 - width += 32 - } - while (this.getBlockIdAt(x + width + 1, roofY, y) !== 0) { - width += 32 - } - while (this.getBlockIdAt(x, roofY, y + height + 1) !== 0) { - height += 32 - } - while (this.getBlockIdAt(x + width, roofY, y + height + 1) !== 0) { // Second iteration incase of L shape - height += 32 - } - while (this.getBlockIdAt(x + width + 1, roofY, y + height) !== 0) { // Second iteration incase of L shape - width += 32 - } - while (this.getBlockIdAt(x + width, roofY, y - 1) !== 0 - && this.getBlockIdAt(x + width, roofY, y - 1 + (height === 30 ? 0 : 32)) !== 0) {// Second iteration incase of L shape - y -= 32 - height += 32 - } - while (this.getBlockIdAt(x - 1, roofY, y + height) !== 0 - && this.getBlockIdAt(x - 1 + (width === 30 ? 0 : 32), roofY, y + height) !== 0) { // Third iteration incase of L shape - x -= 32 - width += 32 - } - - let rotation = this.getRotation(x, y, width, height, roofY); - return { - x, - y, - width, - height, - cx: x + width / 2, - cy: y + height / 2, - rotation: rotation - } - } - - getRoofAt(x, z) { - let y = 255 - while (y > 0 && World.getBlockAt(new BlockPos(x, y, z)).type.getID() === 0) y-- - - return y - } - - getTopBlockAt(x, z, y) { - if (!y) y = this.getRoofAt(x, z) - - return World.getBlockAt(new BlockPos(x, y, z)).getMetadata() - } - getBlockAt(x, y, z) { - return World.getBlockAt(new BlockPos(x, y, z)).type.getID() - } - getTopBlockAt2(x, z, y) { - if (!y) y = this.getRoofAt(x, z) - - return World.getBlockAt(new BlockPos(x, y, z)).type.getID() + return room.data } onSecretCollect(type, x, y, z) { let loc = `${x},${y},${z}` let currentRoom = this.getCurrentRoom() + if (!currentRoom || !currentRoom.corner) return + if (type === "bat" && currentRoom?.data) { let closestD = Infinity - currentRoom.data.secret_coords?.bat?.forEach(([rx, ry, rz]) => { - let { x: x2, y: y2, z: z2 } = currentRoom.toRoomCoords(rx, ry, rz); + currentRoom.data.secret_coords?.bat?.forEach((pos) => { + let actualPos = currentRoom.getRealCoord(pos) + if (!actualPos) return + + let [x2, y2, z2] = actualPos if (this.collectedSecrets.has(x2 + "," + y2 + "," + z2)) return let distance = (x2 - x) ** 2 + (y2 - y) ** 2 + (z2 - z) ** 2 @@ -1626,8 +1485,11 @@ class DungeonMap { if (type === "item" && currentRoom?.data) { let closestD = 25 - currentRoom.data.secret_coords?.item?.forEach(([rx, ry, rz]) => { - let { x: x2, y: y2, z: z2 } = currentRoom.toRoomCoords(rx, ry, rz); + currentRoom.data.secret_coords?.item?.forEach((pos) => { + let actualPos = currentRoom.getRealCoord(pos) + if (!actualPos) return + + let [x2, y2, z2] = actualPos if (this.collectedSecrets.has(x2 + "," + y2 + "," + z2)) return let distance = (x2 - x) ** 2 + (y2 - y) ** 2 + (z2 - z) ** 2 @@ -1678,4 +1540,4 @@ let dungeonMapButtons = [ ChatLib.chat("&c" + ChatLib.getChatBreak("-")) }], ["Navigate", (dungeonMap, clickedRoom) => { ChatLib.chat("NAVIGATION NOT ADDED YET D:") }] -] \ No newline at end of file +] diff --git a/Components/MapPlayer.js b/Components/MapPlayer.js index a804044..ba0cf85 100644 --- a/Components/MapPlayer.js +++ b/Components/MapPlayer.js @@ -1,9 +1,9 @@ import SoopyNumber from "../../guimanager/Classes/SoopyNumber.js" import renderLibs from "../../guimanager/renderLibs.js" -import { f, m } from "../../mappings/mappings.js" import settings from "../Extra/Settings/CurrentSettings.js" import RenderContext from "../Render/RenderContext.js" import Position from "../Utils/Position.js" +import RoomComponent from "../Utils/RoomComponent.js" import { dungeonOffsetX, dungeonOffsetY, getSBID } from "../Utils/Utils.js" import { fetch } from "../Utils/networkUtils.js" @@ -19,7 +19,7 @@ class MapPlayer { this.networkPlayerInfo = networkPlayerInfo this.dungeonMap = dungeonMap - this.location = new Position(0, 0, dungeonMap) + this.location = new RoomComponent(0, 0, dungeonMap) this.location.worldXRaw.setAnimMode("linea") this.location.worldYRaw.setAnimMode("linea") @@ -173,10 +173,8 @@ class MapPlayer { this.yaw.set(yaw, time) } - getRoom(dungeon) { - let x = ~~((this.location.worldX + dungeonOffsetX) / 32); - let y = ~~((this.location.worldY + dungeonOffsetY) / 32); - return dungeon.rooms.get(x + ',' + y) + getRoom() { + return this.dungeonMap.getRoomAt(this.location.worldX, this.location.worldY) } drawAt(x, y, w, h, showIcons = false, rotation = 0, borderWidth = 2) { @@ -199,27 +197,35 @@ class MapPlayer { Renderer.drawRect(Renderer.color(this.playerColor[0] ?? 0, this.playerColor[1] ?? 0, this.playerColor[2] ?? 0, this.playerColor[3] ?? 255), -w / 2 - borderWidth * w / 30, -h / 2 - borderWidth * w / 30, w + borderWidth * 2 * w / 30, h + borderWidth * 2 * w / 30) } - GlStateManager[m.enableBlend]() - Client.getMinecraft()[m.getTextureManager]()[m.bindTexture.TextureManager](this.networkPlayerInfo[m.getLocationSkin.NetworkPlayerInfo]()) - GlStateManager[m.enableTexture2D]() - - let tessellator = MCTessellator[m.getInstance.Tessellator]() - let worldRenderer = tessellator[m.getWorldRenderer]() - worldRenderer[m.begin](7, DefaultVertexFormats[f.POSITION_TEX]) - - worldRenderer[m.pos](-w / 2, h / 2, 0.0)[m.tex](8 / 64, 16 / 64)[m.endVertex]() - worldRenderer[m.pos](w / 2, h / 2, 0.0)[m.tex](16 / 64, 16 / 64)[m.endVertex]() - worldRenderer[m.pos](w / 2, -h / 2, 0.0)[m.tex](16 / 64, 8 / 64)[m.endVertex]() - worldRenderer[m.pos](-w / 2, -h / 2, 0.0)[m.tex](8 / 64, 8 / 64)[m.endVertex]() - tessellator[m.draw.Tessellator]() - - worldRenderer[m.begin](7, DefaultVertexFormats[f.POSITION_TEX]) - - worldRenderer[m.pos](-w / 2, h / 2, 0.0)[m.tex](40 / 64, 16 / 64)[m.endVertex]() - worldRenderer[m.pos](w / 2, h / 2, 0.0)[m.tex](48 / 64, 16 / 64)[m.endVertex]() - worldRenderer[m.pos](w / 2, -h / 2, 0.0)[m.tex](48 / 64, 8 / 64)[m.endVertex]() - worldRenderer[m.pos](-w / 2, -h / 2, 0.0)[m.tex](40 / 64, 8 / 64)[m.endVertex]() - tessellator[m.draw.Tessellator]() + Tessellator.enableBlend() + // .getTextureManager().bindTexture .getLocationSkin + Client.getMinecraft().func_110434_K().func_110577_a(this.networkPlayerInfo.func_178837_g()) + Tessellator.enableTexture2D() + + // .getInstance() + let tessellator = MCTessellator.func_178181_a() + // .getWorldRenderer() + let worldRenderer = tessellator.func_178180_c() + // .begin .POSITION_TEX + worldRenderer.func_181668_a(7, DefaultVertexFormats.field_181707_g) + + // .pos .tex .endVertex + worldRenderer.func_181662_b(-w / 2, h / 2, 0.0).func_181673_a(8 / 64, 16 / 64).func_181675_d() + worldRenderer.func_181662_b(w / 2, h / 2, 0.0).func_181673_a(16 / 64, 16 / 64).func_181675_d() + worldRenderer.func_181662_b(w / 2, -h / 2, 0.0).func_181673_a(16 / 64, 8 / 64).func_181675_d() + worldRenderer.func_181662_b(-w / 2, -h / 2, 0.0).func_181673_a(8 / 64, 8 / 64).func_181675_d() + // .draw + tessellator.func_78381_a() + + // .begin .POSITION_TEX + worldRenderer.func_181668_a(7, DefaultVertexFormats.field_181707_g) + + worldRenderer.func_181662_b(-w / 2, h / 2, 0.0).func_181673_a(40 / 64, 16 / 64).func_181675_d() + worldRenderer.func_181662_b(w / 2, h / 2, 0.0).func_181673_a(48 / 64, 16 / 64).func_181675_d() + worldRenderer.func_181662_b(w / 2, -h / 2, 0.0).func_181673_a(48 / 64, 8 / 64).func_181675_d() + worldRenderer.func_181662_b(-w / 2, -h / 2, 0.0).func_181673_a(40 / 64, 8 / 64).func_181675_d() + // .draw + tessellator.func_78381_a() } Renderer.retainTransforms(false) Tessellator.popMatrix() @@ -314,21 +320,17 @@ register("step", () => { function getPlayerSecrets(uuid, cacheMs, callback) { if (secretsData.get(uuid)?.[0]?.timestamp > Date.now() - cacheMs) { - callback(secretsData.get(uuid)[1]) - return + callback(secretsData.get(uuid)[1]); + return; } - let apiKey = settings.settings.apiKey + fetch(`https://api.tenios.dev/secrets/${uuid}`).text((secretsNum) => { + let secrets = parseInt(secretsNum); + secretsData.set(uuid, [Date.now(), secrets]); - if (!apiKey) return - fetch(`https://api.hypixel.net/player?key=${apiKey}&uuid=${uuid}`).json(data => { - let secrets = data?.player?.achievements?.skyblock_treasure_hunter || 0 - - secretsData.set(uuid, [Date.now(), secrets]) - - callback(secretsData.get(uuid)[1]) - }) + callback(secretsData.get(uuid)[1]); + }); } -const markerSelf = new Image("markerSelf.png", "https://i.imgur.com/mwpjgRz.png"); -const markerOther = new Image("markerOther.png", "https://i.imgur.com/xnoBx3p.png"); \ No newline at end of file +const markerSelf = Image.fromAsset("markerSelf.png"); +const markerOther = Image.fromAsset("markerOther.png"); \ No newline at end of file diff --git a/Components/Room.js b/Components/Room.js index a6a8d67..6a39346 100644 --- a/Components/Room.js +++ b/Components/Room.js @@ -1,13 +1,15 @@ -import { m } from "../../mappings/mappings.js" import DungeonRoomData from "../Data/DungeonRoomData.js" import settings from "../Extra/Settings/CurrentSettings.js" import CurrentSettings from "../Extra/Settings/CurrentSettings.js" import { drawBoxAtBlock } from "../Utils/renderUtils.js" -import { firstLetterCapital } from "../Utils/Utils.js" +import RoomComponent from "../Utils/RoomComponent.js" +import { Checkmark, chunkLoaded, firstLetterCapital, rotateCoords } from "../Utils/Utils.js" +import MapPlayer from "./MapPlayer.js" import { createEvent, RoomEvents, toDisplayString } from "./RoomEvent.js" class Room { + // Room and Door Types static SPAWN = 0 static NORMAL = 1 static PUZZLE = 2 @@ -18,21 +20,21 @@ class Room { static TRAP = 7 static BLACK = 8 // For wither door only - static FAILED = -1; - static UNOPENED = 0; - static ADJACENT = 1; - static OPENED = 2; - static CLEARED = 3; - static COMPLETED = 4; + // Checkmarks + // static FAILED = -1; + // static UNOPENED = 0; + // static ADJACENT = 1; + // static OPENED = 2; + // static CLEARED = 3; + // static COMPLETED = 4; /** * Creates a room based on a type, components, and a room id * @param {Any} dungeon * @param {Number} type - * @param {Array} components - * @param {String} roomId + * @param {Array} components */ - constructor(dungeon, type, components, roomId) { + constructor(dungeon, type, components, roofHeight=null) { /** * @type {Array} */ @@ -41,14 +43,22 @@ class Room { this.dungeon = dungeon + this.name = null this.type = type this.components = components + this.sortComponents() + this.components.forEach(component => this.dungeon.rooms.set(component, this)) + this.width = 30; this.height = 30; this.minX = null; this.minY = null; this.shape = this.findShape() - this.rotation = this.findRotation(); + this.rotation = null + this.roofHeight = roofHeight + this.cores = [] + + this.findRotationAndCorner(); /** * -1 -> failed @@ -58,26 +68,53 @@ class Room { * 3 -> white tick * 4 -> green tick */ - this._checkmarkState = 0 + this._checkmarkState = Checkmark.NONE - this.maxSecrets = undefined + this.maxSecrets = 0 this._currentSecrets = undefined + this.currentSecrets = 0 + // Room data from the room id this.data = undefined - this._roomId = undefined - this.roomId = roomId + } + + /** + * Loads this room's room data + * @param {Object} roomData + */ + setRoomData(roomData) { + this.data = roomData + this.name = roomData.name + this.type = this.getTypeFromString(this.data.type) + this.maxSecrets = this.data.secrets + this.cores = roomData.cores + } + + /** + * Loads the room data for this room from it's core + * @param {Number} core + * @returns + */ + loadFromCore(core) { + let roomData = DungeonRoomData.getDataFromCore(core) + if (!roomData) return false + + this.setRoomData(roomData) + return true } set checkmarkState(val) { - if (this.checkmarkState !== val) { + // Checkmark changed to either Whiteo or Green + if (this.checkmarkState !== val && val !== Checkmark.GRAY && val !== Checkmark.NONE) { this.addEvent(RoomEvents.CHECKMARK_STATE_CHANGE, this.checkmarkState, val) - if ((this._checkmarkState === Room.OPENED || this._checkmarkState === Room.UNOPENED) - && (val === Room.CLEARED || val === Room.COMPLETED) - && this.type !== Room.FAIRY && this.type !== Room.SPAWN) { + const old = this._checkmarkState + const newlyCheckmarked = (old == Checkmark.NONE || old == Checkmark.GRAY) && (val == Checkmark.WHITE || val == Checkmark.GREEN) + + if (newlyCheckmarked && this.type !== Room.FAIRY && this.type !== Room.SPAWN) { let players = this.getPlayersInRoom() players.forEach(p => { @@ -105,20 +142,24 @@ class Room { return this._currentSecrets } - addComponents(newComponents) { + sortComponents() { + this.components.sort((a, b) => a.posIndex - b.posIndex) + } + + /** + * + * @param {RoomComponent} component + */ + addComponent(component) { + if (this.components.includes(component)) return - let parts = [] - this.components.forEach(c => parts.push(c.arrayX + ',' + c.arrayY)); + this.components.push(component) + this.sortComponents() - this.components.push(newComponents) this.shape = this.findShape() - this.rotation = this.findRotation(); - } + this.findRotationAndCorner(); - addDoor(newDoor) { - this.adjacentDoors.push(newDoor); - this.shape = this.findShape() - this.rotation = this.findRotation() + this.dungeon.rooms.set(component, this) } /** @@ -142,140 +183,44 @@ class Room { return "L" } - findRotation() { - if (this.type === Room.FAIRY) return 1; - - // Commented out stuff gets the room rotation differently to whatever soopy decided on for his rotations ): - // Rotates the room the same way Hypixel does, getting the same result as if you were to scan the ceiling. - - // let components = this.components.map(a => [a.arrayX, a.arrayY]) - // const x = this.components.map(a => a.arrayX) - // const y = this.components.map(a => a.arrayY) - // const uniqueX = new Set(x).size - // const uniqueY = new Set(y).size - - // // 2x2's never rotate - // if (this.shape == "2x2") return 1 - - // // Flat long room = not rotated, vertical = rotated 270 degrees - // if (["1x4", "1x3", "1x2"].includes(this.shape)) { - // if (uniqueX == 1) return 1 - // if (uniqueY == 1) return 3 - // } - - - // // L rooms - // if (this.shape == "L") { - // // Finds the component with two adjacent components. The corner of the L. - // let corner = components.find(([x1, y1]) => components.filter(([x2, y2])=>(y1 == y2 && (x1 == x2+1 || x1 == x2-1)) || (x1 == x2 && (y1 == y2+1 || y1 == y2-1))).length == 2) - // let [cx, cy] = corner - - // const minx = Math.min(...x) - // const maxx = Math.max(...x) - // const miny = Math.min(...y) - // const maxy = Math.max(...y) - - // if (cx == minx && cy == maxy) return 1 // Bottom Left - // if (cx == maxx&& cy == maxy) return 2 // Bottom Right - // if (cx == maxx&& cy == miny) return 3 // Top Right - // if (cx == minx && cy == miny) return 4 // Top Left - // } - - // // Only 1x1's left, not done yet - - // if (this.shape == "1x1") { - // // a - // } - - // ------------------------- - - - let minX = -1, maxX = -1, minY = -1, maxY = -1; - this.components.forEach((c) => { + findRotationAndCorner() { + // Roof height is needed to find stained clay + if (!this.roofHeight) return - if (minX < 0 || c.arrayX < minX) minX = c.arrayX; - if (maxX < 0 || c.arrayX > maxX) maxX = c.arrayX; - if (minY < 0 || c.arrayY < minY) minY = c.arrayY; - if (maxY < 0 || c.arrayY > maxY) maxY = c.arrayY; + if (this.type == Room.FAIRY) { + this.rotation = 0 + let x = this.components[0].worldX + let z = this.components[0].worldY - if (!this.minX || this.minX > c.worldX) this.minX = c.worldX; - if (!this.minY || this.minY > c.worldY) this.minY = c.worldY; - }); - - let dx = maxX - minX; - let dy = maxY - minY; - - this.width = 30 + 32 * dx; - this.height = 30 + 32 * dy; - - if (dx > 0 && dy > 0) { - // 2x2 - if (this.components.length === 4) return 1 - if (this.components.length === 3) { - let parts = this.components.reduce((a, b) => [...a, b.arrayX + ',' + b.arrayY], []) - - if (!parts.includes(minX + ',' + minY)) return 0 - if (!parts.includes(minX + ',' + maxY)) return 3 - if (!parts.includes(maxX + ',' + minY)) return 1 - if (!parts.includes(maxX + ',' + maxY)) return 2 - return -1; - // OH IT'S AN L ROOM - } - } - if (dx > 0) return 1 - if (dy > 0) return 2 - let roomX = minX; - let roomY = minY; - let doorLocations = this.adjacentDoors.map(a => `${a.position.arrayX},${a.position.arrayY}`) - let up = doorLocations.includes((roomX + 0.5) + ',' + (roomY)); - let down = doorLocations.includes((roomX + 0.5) + ',' + (roomY + 1)); - let right = doorLocations.includes((roomX + 1) + ',' + (roomY + 0.5)); - let left = doorLocations.includes((roomX) + ',' + (roomY + 0.5)); - // 1x1s, check door positions - // Do not ask me why - if (this.adjacentDoors.length === 4) return 1 - if (this.adjacentDoors.length === 3) { - if (!left) return 3; - if (!right) return 1; - if (!up) return 0; - if (!down) return 2; - } - if (this.adjacentDoors.length === 1) { - // Dead end - if (right) return 2; - else if (left) return 0; - else if (down) return 3; - else if (up) return 1; + this.corner = [x-15.5, 0, z-15.5] + return } - if (up && down) return 2; - if (left && right) return 1; - if (left && down) return 1; - if (up && left) return 2; - if (up && right) return 3; - if (right && down) return 0 + const minX = Math.min(...this.components.map(a => a.worldX)) + const maxX = Math.max(...this.components.map(a => a.worldX)) + const minY = Math.min(...this.components.map(a => a.worldY)) + const maxY = Math.max(...this.components.map(a => a.worldY)) - return -1; - } + // Corners of the room, in clockwise order from top left + const spots = [ + [minX - 15, minY - 15], + [maxX + 15, minY - 15], + [maxX + 15, maxY + 15], + [minX - 15, maxY + 15] + ] - get roomId() { - return this._roomId - } - /**@param {String} value */ - set roomId(value) { - if (!value) return - - this._roomId = value.trim() - this.data = DungeonRoomData.getDataFromId(value.trim()) + for (let i = 0; i < spots.length; i++) { + let [x, z] = spots[i] - if (!this.data) return - let oldMax = this.maxSecrets + if (!chunkLoaded(x, this.roofHeight, z)) return - this.maxSecrets = this.data.secrets - this.currentSecrets = this.currentSecrets || 0 + // Looking for blue stained hardened clay at the corner of the room + let block = World.getBlockAt(x, this.roofHeight, z) + if (block.type.getID() !== 159 || block.getMetadata() !== 11) continue - if (this.maxSecrets !== oldMax) { - this.addEvent(RoomEvents.SECRET_COUNT_CHANGE, (this.currentSecrets || 0) + "/" + (oldMax || "???"), (this.currentSecrets || 0) + "/" + this.maxSecrets) + this.rotation = i + this.corner = [x+0.5, 0, z+0.5] + return } } @@ -287,8 +232,26 @@ class Room { this.roomEvents.push(createEvent(event, ...args)) } + getTypeFromString(typeString) { + const types = { + "spawn": Room.SPAWN, + "normal": Room.NORMAL, + "mobs": Room.NORMAL, + "miniboss": Room.NORMAL, + "puzzle": Room.PUZZLE, + "gold": Room.MINIBOSS, + "fairy": Room.FAIRY, + "blood": Room.BLOOD, + "unknown": Room.UNKNOWN, + "trap": Room.TRAP, + } + + if (!(typeString in types)) return null + + return types[typeString] + } + setType(type) { - if (this.roomId) return this.type = type } /** @@ -301,23 +264,28 @@ class Room { return this.checkmarkState >= Room.CLEARED; } + /** + * + * @returns {MapPlayer[]} + */ getPlayersInRoom() { - return this.dungeon.players.filter(p => p.getRoom(this.dungeon) === this) + return this.dungeon.players.filter(p => p.getRoom() === this) } getLore() { let roomLore = [] - if (this.roomId) { - roomLore.push(this.data?.name || '???') - roomLore.push("&8" + (this.roomId || "")) - if (CurrentSettings.settings.devInfo) roomLore.push('&9Rotation: ' + (this.rotation || 'NONE')); + + if (this.data) { + roomLore.push(this.name ?? '???') + // roomLore.push("&8" + (this.roomId || "")) + if (CurrentSettings.settings.devInfo) roomLore.push('&9Rotation: ' + (this.rotation ?? 'NONE')); if (this.data && this.data?.soul) roomLore.push("&dFAIRY SOUL!") if (this.maxSecrets) roomLore.push("Secrets: " + this.currentSecrets + ' / ' + this.maxSecrets) if (this.data?.crypts !== undefined && (this.type === Room.NORMAL || this.type === Room.MINIBOSS || this.type === Room.TRAP)) roomLore.push("Crypts: " + this.data.crypts) if (this.type === Room.NORMAL) roomLore.push("Ceiling Spiders: " + (this.data?.spiders ? "Yes" : "No")) } else { - roomLore.push('Unknown room!') + roomLore.push(this.name ?? 'Unknown room!') if (CurrentSettings.settings.devInfo) roomLore.push('&9Rotation: ' + (this.rotation > -1 ? this.rotation : 'NONE')); } @@ -332,60 +300,58 @@ class Room { return roomLore } - toRoomCoords(px, py, pz) { - let { x, y, z } = this.rotateCoords(px, py, pz); - return { x: this.minX + x, y: y, z: this.minY + z }; - } + /** + * Converts coordinates from the real world into relative, rotated room coordinates + * @param {[Number, Number, Number]} coord + * @returns + */ + getRoomCoord(coord, ints=true) { + if (this.rotation == null || !this.corner) return null - getRelativeCoords(x, y, z) { - let dx = x - this.minX - let dy = y; - let dz = z - this.minY; - - // Rotate opposite direction - switch (this.rotation) { - case 2: - return { x: dz, y: dy, z: this.width - dx }; - case 3: - return { x: this.width - dx, y: dy, z: this.height - dz };; - case 0: - return { x: this.height - dz, y: dy, z: dx };; - case 1: - default: - return { x: dx, y: dy, z: dz }; - } + const cornerCoord = ints ? this.corner.map(Math.floor) : this.corner + const roomCoord = rotateCoords(coord.map((v, i) => v - cornerCoord[i]), this.rotation) + + if (ints) return roomCoord.map(Math.floor) + + return roomCoord } - rotateCoords(x, y, z) { - switch (this.rotation) { - case 2: - return { x: this.width - z, y: y, z: x }; - case 3: - return { x: this.width - x, y: y, z: this.height - z }; - case 0: - return { x: z, y: y, z: this.height - x }; - case 1: - // No break, default rotation - default: - return { x: x, y: y, z: z }; - } + /** + * Converts relative room coords and inversely rotates and translates them to real world coordinates + * @param {[Number, Number, Number]} coord + * @returns + */ + getRealCoord(coord, ints=true) { + if (this.rotation == null || !this.corner) return null + + const rotated = rotateCoords(coord, 4 - this.rotation) + const roomCorner = ints ? this.corner.map(Math.floor) : this.corner + const realCoord = rotated.map((v, i) => v + roomCorner[i]) + + if (ints) return realCoord.map(Math.floor) + + return realCoord + } drawRoomSecrets() { if (!settings.settings.showSecrets) return - if (!this.data) return + if (!this.data || !this.corner) return // TODO: account for 3/1 room - if (this.currentSecrets === this.maxSecrets) return + if (this.currentSecrets >= this.maxSecrets) return if (!("secret_coords" in this.data)) return //ChatLib.chat("No Data!") // Every secret type in the room Object.entries(this.data.secret_coords).forEach(([type, secrets]) => { // Loop over every secret - secrets.forEach(([rx, ry, rz]) => { - let { x, y, z } = this.toRoomCoords(rx, ry, rz) + secrets.forEach((pos) => { + const secretPos = this.getRealCoord(pos) + if (!secretPos) return + let [ x, y, z ] = secretPos + if (this.dungeon.collectedSecrets.has(x + "," + y + "," + z)) return; - if (type == "chest") drawBoxAtBlock(x, y, z, 0, 1, 0, 1, 1) + if (type == "chest") drawBoxAtBlock(x+0.0625, y, z+0.0625, 0, 1, 0, 0.875, 0.875) if (type == "item") drawBoxAtBlock(x + 0.25, y, z + 0.25, 0, 0, 1, 0.5, 0.5) if (type == "wither") drawBoxAtBlock(x + 0.25, y, z + 0.25, 1, 0, 1, 0.5, 0.5) if (type == "bat") drawBoxAtBlock(x + 0.25, y + 0.25, z + 0.25, 0, 1, 0, 0.5, 0.5) @@ -393,36 +359,6 @@ class Room { }); }) - // this.data.secret_coords?.chest?.forEach(([rx, ry, rz]) => { - // let { x, y, z } = this.toRoomCoords(rx, ry, rz); - - // if (this.dungeon.collectedSecrets.has(x + "," + y + "," + z)) return - // drawBoxAtBlock(x, y, z, 0, 1, 0, 1, 1) - // }); - // this.data.secret_coords?.item?.forEach(([rx, ry, rz]) => { - // let { x, y, z } = this.toRoomCoords(rx, ry, rz); - - // if (this.dungeon.collectedSecrets.has(x + "," + y + "," + z)) return - // drawBoxAtBlock(x + 0.25, y, z + 0.25, 0, 0, 1, 0.5, 0.5) - // }); - // this.data.secret_coords?.wither?.forEach(([rx, ry, rz]) => { - // let { x, y, z } = this.toRoomCoords(rx, ry, rz); - - // if (this.dungeon.collectedSecrets.has(x + "," + y + "," + z)) return - // drawBoxAtBlock(x + 0.25, y, z + 0.25, 1, 0, 1, 0.5, 0.5) - // }); - // this.data.secret_coords?.bat?.forEach(([rx, ry, rz]) => { - // let { x, y, z } = this.toRoomCoords(rx, ry, rz); - - // if (this.dungeon.collectedSecrets.has(x + "," + y + "," + z)) return - // drawBoxAtBlock(x + 0.25, y + 0.25, z + 0.25, 0, 1, 0, 0.5, 0.5) - // }); - // this.data.secret_coords?.redstone_key?.forEach(([rx, ry, rz]) => { - // let { x, y, z } = this.toRoomCoords(rx, ry, rz); - - // if (this.dungeon.collectedSecrets.has(x + "," + y + "," + z)) return - // drawBoxAtBlock(x + 0.25, y, z + 0.25, 1, 0, 0, 0.5, 0.5) - // }); } checkmarkStateToName(state = this.checkmarkState) { @@ -448,16 +384,19 @@ class Room { static typeToColor(type) { return typeColor.get(type) } + + toString() { + return `Room["${this.name || "Unknown"}", [${this.components.map(a => a.toString()).join(",")}], ${this.type}, rot=${this.rotation}]` + } } let checkmarkStateName = new Map() -checkmarkStateName.set(Room.FAILED, "FAILED") -checkmarkStateName.set(Room.UNOPENED, "UNOPENED") -checkmarkStateName.set(Room.ADJACENT, "ADJACENT") -checkmarkStateName.set(Room.OPENED, "OPENED") -checkmarkStateName.set(Room.CLEARED, "CLEARED") -checkmarkStateName.set(Room.COMPLETED, "COMPLETED") +checkmarkStateName.set(Checkmark.FAILED, "FAILED") +checkmarkStateName.set(Checkmark.GRAY, "GRAY") +checkmarkStateName.set(Checkmark.NONE, "NONE") +checkmarkStateName.set(Checkmark.WHITE, "WHITE") +checkmarkStateName.set(Checkmark.GREEN, "GREEN") let typeName = new Map() typeName.set(Room.SPAWN, "SPAWN") diff --git a/Data/DungeonRoomData.js b/Data/DungeonRoomData.js index c5bba1f..ddca221 100644 --- a/Data/DungeonRoomData.js +++ b/Data/DungeonRoomData.js @@ -31,24 +31,28 @@ class DungeonRoomStaticData { this.fullRoomData = JSON.parse(FileLib.read("BetterMap", "Data/roomdata.json")) this.idMap = new Map() - this.fullRoomData?.forEach((d, i) => { - d.id.forEach(id => { - this.idMap.set(id, i) - }) - this.idMap.set(d.index, i) - }) + this.coreMap = new Map() // "CORE": "ROOMDATA" - fetch("https://soopy.dev/api/bettermap/roomdata").json(data => { - FileLib.write("BetterMap", "Data/roomdata.json", JSON.stringify(data, null, 4)) + this.update() - this.fullRoomData = data - this.idMap = new Map() - this.fullRoomData.forEach((d, i) => { - d.id.forEach(id => { - this.idMap.set(id, i) - }) - this.idMap.set(d.index, i) + // fetch("https://soopy.dev/api/bettermap/roomdata").json(data => { + // FileLib.write("BetterMap", "Data/roomdata.json", JSON.stringify(data, null, 4)) + // this.fullRoomData = data + // this.update() + // }) + } + + update() { + this.fullRoomData?.forEach((roomData, i) => { + roomData.id.forEach(roomId => { + this.idMap.set(roomId, i) }) + this.idMap.set(roomData.index, i) + + // Map cores to room IDs + for (let core of roomData.cores) { + this.coreMap.set(core, roomData) + } }) } @@ -66,6 +70,15 @@ class DungeonRoomStaticData { return this.fullRoomData[this.idMap.get(id)] } + /** + * Gets room data given a room's core + * @param {Number} core + * @returns + */ + getDataFromCore(core) { + return this.coreMap.get(core) ?? null + } + /** * * @param {String} name the room id diff --git a/Data/roomdata.json b/Data/roomdata.json new file mode 100644 index 0000000..db05ea0 --- /dev/null +++ b/Data/roomdata.json @@ -0,0 +1,6078 @@ +[ + { + "id": [ + "282,66", + "102,66" + ], + "name": "Entrance", + "type": "spawn", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 0 + }, + "soul": false, + "cores": [ + 274652966, + -1092072828, + 1913969999 + ] + }, + { + "name": "Mines", + "type": "mobs", + "shape": "2x2", + "secrets": 10, + "crypts": 11, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 3, + "chest": 7 + }, + "soul": false, + "id": [ + "710,-592" + ], + "secret_coords": { + "chest": [ + [ + 9, + 82, + 21 + ], + [ + 41, + 80, + 12 + ], + [ + 9, + 108, + 17 + ], + [ + 9, + 109, + 30 + ], + [ + 31, + 99, + 58 + ], + [ + 56, + 78, + 58 + ], + [ + 60, + 43, + 50 + ] + ], + "item": [ + [ + 1, + 89, + 57 + ], + [ + 53, + 48, + 8 + ], + [ + 4, + 54, + 56 + ] + ] + }, + "cores": [ + 1363618678, + -361911912, + 1227315161, + -39488099 + ] + }, + { + "name": "Doors", + "type": "mobs", + "shape": "1x2", + "secrets": 5, + "crypts": 7, + "revive_stones": 1, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 4 + }, + "soul": false, + "id": [ + "642,-384" + ], + "secret_coords": { + "chest": [ + [ + 5, + 87, + 28 + ], + [ + 31, + 51, + 17 + ], + [ + 8, + 58, + 17 + ], + [ + 8, + 58, + 13 + ] + ], + "bat": [ + [ + 46, + 65, + 15 + ] + ] + }, + "cores": [ + 164990589, + 1033794268 + ] + }, + { + "name": "Locked Away", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 1, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "246,-132" + ], + "secret_coords": { + "chest": [ + [ + 26, + 75, + 29 + ] + ] + }, + "cores": [ + 754378401 + ] + }, + { + "name": "Beams", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 2, + "crypts": 2, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "750,-240" + ], + "secret_coords": { + "chest": [ + [ + 7, + 81, + 2 + ] + ], + "item": [ + [ + 8, + 92, + 24 + ] + ] + }, + "cores": [ + -2082251638 + ] + }, + { + "name": "Hall", + "type": "mobs", + "shape": "1x1", + "doors": " ", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 0 + }, + "soul": false, + "id": [ + "30,-204" + ], + "cores": [ + -2131538192 + ] + }, + { + "name": "Banners", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 1, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "30,-276" + ], + "cores": [ + -667603340 + ], + "secret_coords": { + "chest": [ + [ + 27, + 72, + 15 + ] + ] + } + }, + { + "name": "Andesite", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 2, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 0 + }, + "soul": false, + "id": [ + "30,-132" + ], + "secret_coords": { + "item": [ + [ + 1, + 69, + 28 + ] + ], + "wither": [ + [ + 6, + 69, + 22 + ] + ] + }, + "cores": [ + -673246822 + ] + }, + { + "name": "Painting", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 2, + "crypts": 0, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 0 + }, + "soul": false, + "id": [ + "30,-96" + ], + "secret_coords": { + "item": [ + [ + 24, + 69, + 21 + ] + ], + "wither": [ + [ + 6, + 80, + 21 + ] + ] + }, + "cores": [ + 474745227 + ] + }, + { + "name": "Multicolored", + "type": "mobs", + "shape": "1x1", + "doors": "X", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "66,-348" + ], + "secret_coords": { + "chest": [ + [ + 25, + 70, + 4 + ] + ] + }, + "cores": [ + -671539463 + ] + }, + { + "name": "Black Flag", + "type": "mobs", + "shape": "1x1", + "doors": "X", + "secrets": 3, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 2 + }, + "soul": false, + "id": [ + "534,-312" + ], + "cores": [ + 153580070 + ], + "secret_coords": { + "chest": [ + [ + 27, + 80, + 3 + ], + [ + 28, + 80, + 25 + ] + ], + "item": [ + [ + 22, + 59, + 27 + ] + ] + } + }, + { + "name": "Overgrown Chains", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 2, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "642,-168" + ], + "secret_coords": { + "chest": [ + [ + 26, + 86, + 20 + ] + ], + "item": [ + [ + 3, + 81, + 3 + ] + ] + }, + "cores": [ + 1077887433 + ] + }, + { + "name": "Chains", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 2, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "498,-132" + ], + "secret_coords": { + "chest": [ + [ + 27, + 69, + 10 + ], + [ + 17, + 86, + 14 + ] + ] + }, + "cores": [ + 113272043 + ] + }, + { + "name": "Golden Oasis", + "type": "mobs", + "shape": "1x1", + "doors": "X", + "secrets": 1, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 1, + "bat": 0, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "174,-312" + ], + "secret_coords": { + "redstone_key": [ + [ + 12, + 71, + 8 + ] + ], + "chest": [ + [ + 12, + 63, + 23 + ], + [ + 13, + 63, + 25 + ] + ] + }, + "cores": [ + -1666473430 + ] + }, + { + "name": "Redstone Warrior", + "type": "mobs", + "shape": "1x2", + "secrets": 3, + "crypts": 4, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 2 + }, + "soul": false, + "id": [ + "1118,-384" + ], + "secret_coords": { + "chest": [ + [ + 24, + 58, + 15 + ], + [ + 30, + 83, + 27 + ] + ], + "item": [ + [ + 58, + 78, + 29 + ] + ] + }, + "cores": [ + 1313090868, + 1819727964 + ] + }, + { + "name": "Silvers Sword", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "30,-168" + ], + "secret_coords": { + "chest": [ + [ + 18, + 69, + 13 + ] + ] + }, + "cores": [ + -224496952 + ] + }, + { + "name": "Pedestal", + "type": "mobs", + "shape": "1x2", + "secrets": 5, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": true, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 3 + }, + "soul": false, + "id": [ + "30,-384" + ], + "secret_coords": { + "chest": [ + [ + 31, + 70, + 15 + ], + [ + 7, + 94, + 21 + ], + [ + 32, + 60, + 23 + ] + ], + "item": [ + [ + 50, + 61, + 18 + ] + ], + "wither": [ + [ + 53, + 61, + 22 + ] + ] + }, + "cores": [ + -1346033867, + 281551136 + ] + }, + { + "name": "Temple", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 3, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "678,-240" + ], + "secret_coords": { + "item": [ + [ + 20, + 78, + 28 + ] + ], + "bat": [ + [ + 2, + 65, + 25 + ] + ], + "chest": [ + [ + 16, + 54, + 15 + ] + ] + }, + "cores": [ + 1480555517, + 787162812 + ] + }, + { + "name": "Big Red Flag", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 2, + "crypts": 1, + "revive_stones": 1, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 2, + "chest": 0 + }, + "soul": false, + "id": [ + "102,-96" + ], + "secret_coords": { + "item": [ + [ + 26, + 75, + 25 + ], + [ + 20, + 75, + 23 + ] + ] + }, + "cores": [ + -1265317780 + ] + }, + { + "name": "Mural", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "crypts": 0, + "secrets": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "462,-132" + ], + "secret_coords": { + "chest": [ + [ + 26, + 83, + 7 + ] + ] + }, + "cores": [ + -1027066030 + ] + }, + { + "name": "Perch", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 2, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "462,-96" + ], + "secret_coords": { + "chest": [ + [ + 15, + 74, + 1 + ] + ], + "item": [ + [ + 20, + 76, + 20 + ] + ] + }, + "cores": [ + 27598620 + ] + }, + { + "name": "End", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 2, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "678,-168" + ], + "cores": [ + -1897192562 + ], + "secret_coords": { + "chest": [ + [ + 15, + 69, + 6 + ] + ], + "wither": [ + [ + 6, + 63, + 2 + ] + ] + } + }, + { + "name": "Cage", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "498,-276" + ], + "secret_coords": { + "chest": [ + [ + 12, + 72, + 20 + ] + ] + }, + "cores": [ + 272954274 + ] + }, + { + "name": "Sloth", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 1, + "crypts": 1, + "revive_stones": 1, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 0 + }, + "soul": false, + "id": [ + "66,-276" + ], + "secret_coords": { + "item": [ + [ + 8, + 69, + 22 + ] + ] + }, + "cores": [ + -1390729196 + ] + }, + { + "name": "Steps", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 1, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 0 + }, + "soul": false, + "id": [ + "138,-204" + ], + "cores": [ + 1350621298 + ], + "secret_coords": { + "bat": [ + [ + 14, + 75, + 7 + ] + ] + } + }, + { + "name": "Granite", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 2, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 0 + }, + "soul": false, + "id": [ + "66,-168" + ], + "cores": [ + -456244067 + ], + "secret_coords": { + "item": [ + [ + 14, + 60, + 24 + ] + ], + "wither": [ + [ + 13, + 61, + 29 + ] + ] + } + }, + { + "name": "Crypt", + "type": "mobs", + "shape": "1x2", + "secrets": 5, + "crypts": 2, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 4 + }, + "soul": true, + "id": [ + "438,-384" + ], + "secret_coords": { + "chest": [ + [ + 13, + 60, + 15 + ], + [ + 44, + 86, + 26 + ], + [ + 2, + 81, + 16 + ], + [ + 19, + 89, + 2 + ] + ], + "item": [ + [ + 46, + 88, + 16 + ] + ] + }, + "cores": [ + -845911506, + 331494915 + ] + }, + { + "name": "Dueces", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 3, + "crypts": 6, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "138,-168" + ], + "secret_coords": { + "chest": [ + [ + 2, + 78, + 15 + ] + ], + "item": [ + [ + 10, + 70, + 6 + ] + ], + "bat": [ + [ + 8, + 74, + 7 + ] + ] + }, + "cores": [ + 1046920372 + ] + }, + { + "name": "Red Green", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 3, + "crypts": 2, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 2, + "chest": 1 + }, + "soul": false, + "id": [ + "570,-240" + ], + "secret_coords": { + "item": [ + [ + 13, + 77, + 28 + ], + [ + 1, + 61, + 15 + ] + ], + "chest": [ + [ + 29, + 75, + 15 + ] + ] + }, + "cores": [ + -1085327384 + ] + }, + { + "name": "Long Hall", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 3, + "crypts": 3, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 3 + }, + "soul": false, + "id": [ + "534,-96" + ], + "secret_coords": { + "chest": [ + [ + 18, + 62, + 23 + ], + [ + 28, + 82, + 15 + ] + ] + }, + "cores": [ + -872480083 + ] + }, + { + "name": "Mirror", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 1, + "spiders": true, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "174,-168" + ], + "secret_coords": { + "chest": [ + [ + 3, + 55, + 17 + ] + ] + }, + "cores": [ + -1823353629 + ] + }, + { + "name": "Quad Lava", + "type": "mobs", + "shape": "1x1", + "doors": "X", + "secrets": 2, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "30,-348" + ], + "secret_coords": { + "chest": [ + [ + 25, + 70, + 5 + ], + [ + 11, + 60, + 20 + ] + ] + }, + "cores": [ + 52900193 + ] + }, + { + "name": "Small Waterfall", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 2, + "crypts": 5, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 0 + }, + "soul": false, + "id": [ + "210,-96" + ], + "secret_coords": { + "bat": [ + [ + 3, + 82, + 22 + ] + ], + "wither": [ + [ + 6, + 77, + 26 + ] + ] + }, + "cores": [ + -1682285647 + ] + }, + { + "name": "Basement", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 0 + }, + "soul": false, + "id": [ + "66,-96" + ], + "secret_coords": { + "wither": [ + [ + 5, + 66, + 25 + ] + ] + }, + "cores": [ + -204678789 + ] + }, + { + "name": "Dip", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 2, + "crypts": 3, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "498,-240" + ], + "secret_coords": { + "chest": [ + [ + 18, + 78, + 16 + ], + [ + 2, + 78, + 24 + ] + ] + }, + "cores": [ + -1691958814 + ] + }, + { + "name": "Water", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 2, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "498,-204" + ], + "secret_coords": { + "bat": [ + [ + 17, + 67, + 4 + ] + ], + "chest": [ + [ + 2, + 69, + 5 + ] + ] + }, + "cores": [ + -1849552977 + ] + }, + { + "name": "Dome", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 2, + "crypts": 2, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "642,-240" + ], + "cores": [ + 462413746 + ], + "secret_coords": { + "bat": [ + [ + 25, + 75, + 22 + ] + ], + "chest": [ + [ + 26, + 78, + 27 + ] + ] + } + }, + { + "name": "Scaffolding", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 2, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "210,-132" + ], + "secret_coords": { + "item": [ + [ + 18, + 82, + 8 + ] + ], + "chest": [ + [ + 5, + 82, + 28 + ] + ] + }, + "cores": [ + -116661966 + ] + }, + { + "name": "Small Stairs", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 2, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "606,-168" + ], + "secret_coords": { + "item": [ + [ + 24, + 63, + 3 + ] + ], + "chest": [ + [ + 3, + 82, + 6 + ] + ] + }, + "cores": [ + -1250912300 + ] + }, + { + "name": "Tomioka", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 0 + }, + "soul": true, + "id": [ + "138,-132" + ], + "cores": [ + -195263543 + ] + }, + { + "name": "Mushroom", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 1, + "crypts": 0, + "revive_stones": "100k per", + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "174,-132" + ], + "secret_coords": { + "chest": [ + [ + 16, + 80, + 17 + ] + ] + }, + "cores": [ + 1073109158 + ] + }, + { + "name": "Slabs", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 2, + "crypts": 2, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "570,-168" + ], + "secret_coords": { + "chest": [ + [ + 22, + 85, + 3 + ], + [ + 23, + 85, + 3 + ] + ] + }, + "cores": [ + -1811244478 + ] + }, + { + "name": "Duncan", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 0 + }, + "soul": false, + "id": [ + "30,-240" + ], + "secret_coords": { + "item": [ + [ + 13, + 89, + 8 + ] + ] + }, + "cores": [ + 544418695 + ] + }, + { + "name": "Logs", + "type": "mobs", + "shape": "1x1", + "doors": "X", + "secrets": 4, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 4 + }, + "soul": false, + "id": [ + "102,-312" + ], + "secret_coords": { + "chest": [ + [ + 23, + 70, + 29 + ], + [ + 24, + 70, + 29 + ], + [ + 23, + 78, + 21 + ], + [ + 24, + 78, + 21 + ] + ] + }, + "cores": [ + -1803705489 + ] + }, + { + "name": "Cages", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 2, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "750,-168" + ], + "secret_coords": { + "item": [ + [ + 28, + 98, + 5 + ] + ], + "chest": [ + [ + 7, + 58, + 11 + ] + ] + }, + "cores": [ + -1985726084 + ] + }, + { + "name": "Admin", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 0, + "crypts": 34, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 0 + }, + "soul": true, + "id": [ + "102,-168" + ], + "cores": [ + -1989372370 + ] + }, + { + "name": "Skull", + "type": "mobs", + "shape": "1x2", + "secrets": 2, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "98,-384" + ], + "secret_coords": { + "chest": [ + [ + 2, + 88, + 15 + ], + [ + 52, + 91, + 7 + ] + ] + }, + "cores": [ + 1667732153, + -46929855 + ] + }, + { + "name": "Balcony", + "type": "mobs", + "shape": "1x2", + "secrets": 4, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 2 + }, + "soul": false, + "id": [ + "710,-384" + ], + "secret_coords": { + "chest": [ + [ + 27, + 69, + 15 + ], + [ + 20, + 42, + 28 + ] + ], + "bat": [ + [ + 4, + 60, + 25 + ] + ], + "item": [ + [ + 14, + 51, + 7 + ] + ] + }, + "cores": [ + 1989395652, + 559495102, + -904697545 + ] + }, + { + "name": "Knight", + "type": "mobs", + "shape": "1x1", + "doors": "X", + "secrets": 3, + "crypts": 0, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "66,-312" + ], + "cores": [ + -1746428299 + ], + "secret_coords": { + "bat": [ + [ + 6, + 76, + 23 + ] + ], + "chest": [ + [ + 24, + 69, + 29 + ], + [ + 25, + 69, + 29 + ] + ] + } + }, + { + "name": "Sarcophagus", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 3, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "462,-204" + ], + "cores": [ + 1986002687, + 1907859753 + ], + "secret_coords": { + "chest": [ + [ + 15, + 69, + 4 + ] + ], + "bat": [ + [ + 21, + 70, + 26 + ] + ], + "wither": [ + [ + 18, + 68, + 27 + ] + ] + } + }, + { + "name": "Drop", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 2, + "crypts": 6, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "462,-168" + ], + "secret_coords": { + "chest": [ + [ + 5, + 59, + 15 + ], + [ + 25, + 77, + 2 + ] + ] + }, + "cores": [ + -1236195770 + ] + }, + { + "name": "Raccoon", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 4, + "crypts": 2, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 4 + }, + "soul": true, + "id": [ + "174,-96" + ], + "secret_coords": { + "chest": [ + [ + 6, + 77, + 24 + ], + [ + 27, + 69, + 24 + ], + [ + 21, + 69, + 24 + ], + [ + 26, + 84, + 8 + ] + ] + }, + "cores": [ + 497881745 + ] + }, + { + "name": "Double Diamond", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 3, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "642,-96" + ], + "secret_coords": { + "item": [ + [ + 24, + 65, + 22 + ] + ], + "wither": [ + [ + 6, + 69, + 6 + ] + ], + "chest": [ + [ + 11, + 82, + 19 + ] + ] + }, + "cores": [ + 1308341800 + ] + }, + { + "name": "Blue Skulls", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 1, + "crypts": 4, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 0 + }, + "soul": false, + "id": [ + "102,-132" + ], + "secret_coords": { + "item": [ + [ + 27, + 77, + 29 + ] + ] + }, + "cores": [ + 45200304 + ] + }, + { + "name": "Leaves", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 1, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": true, + "id": [ + "66,-240" + ], + "secret_coords": { + "chest": [ + [ + 14, + 81, + 27 + ] + ] + }, + "cores": [ + -1967474423, + 863355661 + ] + }, + { + "name": "Withermancer", + "type": "mobs", + "shape": "L", + "secrets": 4, + "crypts": 6, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 3 + }, + "soul": false, + "id": [ + "710,-524" + ], + "secret_coords": { + "chest": [ + [ + 59, + 55, + 45 + ], + [ + 15, + 104, + 20 + ], + [ + 29, + 111, + 15 + ] + ], + "wither": [ + [ + 1, + 111, + 15 + ] + ] + }, + "cores": [ + -1645219026, + -499989468, + -406356904, + -1293381735 + ] + }, + { + "name": "Redstone Key", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 3, + "crypts": 4, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 2 + }, + "soul": false, + "id": [ + "534,-168" + ], + "secret_coords": { + "item": [ + [ + 26, + 69, + 5 + ] + ], + "redstone_key": [ + [ + 19, + 66, + 7 + ], + [ + 10, + 70, + 26 + ] + ], + "chest": [ + [ + 28, + 62, + 23 + ] + ] + }, + "cores": [ + 348655632 + ] + }, + { + "name": "Prison Cell", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 1, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "66,-132" + ], + "secret_coords": { + "chest": [ + [ + 10, + 76, + 23 + ] + ] + }, + "cores": [ + 1172045122 + ] + }, + { + "name": "Cell", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 2, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 0 + }, + "soul": false, + "id": [ + "66,-204" + ], + "secret_coords": { + "item": [ + [ + 10, + 69, + 22 + ] + ] + }, + "cores": [ + 1751890846 + ] + }, + { + "name": "Arrow Trap", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 1, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "534,-204" + ], + "secret_coords": { + "chest": [ + [ + 14, + 69, + 4 + ] + ] + }, + "cores": [ + 332584803 + ] + }, + { + "name": "Bridges", + "type": "mobs", + "shape": "1x2", + "secrets": 6, + "crypts": 6, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 2, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 2 + }, + "soul": false, + "id": [ + "1050,-384" + ], + "secret_coords": { + "wither": [ + [ + 53, + 53, + 13 + ], + [ + 53, + 52, + 17 + ] + ], + "chest": [ + [ + 41, + 52, + 21 + ], + [ + 3, + 82, + 15 + ] + ], + "bat": [ + [ + 48, + 97, + 2 + ] + ], + "item": [ + [ + 55, + 81, + 17 + ] + ] + }, + "cores": [ + -1222835760, + -1989950542, + -481076847, + -866588661, + 1919504940 + ] + }, + { + "name": "Cobble Wall Pillar", + "type": "mobs", + "shape": "1x1", + "doors": "X", + "secrets": 2, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "102,-348" + ], + "cores": [ + 259238824, + -948372640 + ], + "secret_coords": { + "chest": [ + [ + 28, + 60, + 12 + ], + [ + 12, + 61, + 17 + ] + ] + } + }, + { + "name": "Spikes", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 3, + "crypts": 2, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "498,-168" + ], + "secret_coords": { + "chest": [ + [ + 4, + 91, + 11 + ] + ], + "bat": [ + [ + 2, + 54, + 7 + ] + ], + "wither": [ + [ + 1, + 53, + 8 + ] + ] + }, + "cores": [ + 881396995 + ] + }, + { + "name": "Gold", + "type": "mobs", + "shape": "1x2", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 3, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 0 + }, + "soul": false, + "id": [ + "166,-384" + ], + "cores": [ + 1451614295, + -1035453872 + ], + "secret_coords": { + "wither": [ + [ + 14, + 69, + 13 + ] + ] + } + }, + { + "name": "Chambers", + "type": "mobs", + "shape": "L", + "secrets": 5, + "crypts": 6, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 4 + }, + "soul": false, + "id": [ + "506,-524" + ], + "secret_coords": { + "chest": [ + [ + 53, + 57, + 47 + ], + [ + 4, + 69, + 57 + ], + [ + 7, + 69, + 40 + ], + [ + 15, + 83, + 2 + ] + ], + "bat": [ + [ + 33, + 84, + 57 + ] + ] + }, + "cores": [ + 368708000, + 252800591, + 1756685113 + ] + }, + { + "name": "Lava Ravine", + "type": "mobs", + "shape": "L", + "secrets": 6, + "crypts": 4, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 4 + }, + "soul": false, + "id": [ + "642,-524" + ], + "secret_coords": { + "chest": [ + [ + 29, + 88, + 9 + ], + [ + 29, + 88, + 7 + ], + [ + 58, + 86, + 47 + ], + [ + 23, + 67, + 57 + ] + ], + "bat": [ + [ + 12, + 64, + 33 + ] + ], + "item": [ + [ + 16, + 51, + 32 + ] + ] + }, + "cores": [ + -294054018, + -2053308786, + -2040489612 + ] + }, + { + "name": "Wizard", + "type": "mobs", + "shape": "1x3", + "secrets": 4, + "crypts": 8, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 2 + }, + "soul": false, + "id": [ + "530,-420" + ], + "secret_coords": { + "chest": [ + [ + 17, + 92, + 26 + ], + [ + 90, + 89, + 24 + ] + ], + "item": [ + [ + 3, + 76, + 21 + ] + ], + "bat": [ + [ + 25, + 53, + 12 + ] + ] + }, + "cores": [ + 735485465, + 1958624830, + -23510667, + -1994781831, + -563599391 + ] + }, + { + "name": "Overgrown", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 3, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "714,-240" + ], + "secret_coords": { + "item": [ + [ + 4, + 70, + 2 + ] + ], + "chest": [ + [ + 6, + 79, + 15 + ] + ], + "wither": [ + [ + 5, + 87, + 19 + ] + ] + }, + "cores": [ + 1858897577 + ] + }, + { + "name": "Jumping Skulls", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "102,-204" + ], + "cores": [ + -1496765468 + ], + "secret_coords": { + "chest": [ + [ + 26, + 62, + 23 + ] + ] + } + }, + { + "name": "Lots Of Floors", + "type": "mobs", + "shape": "1x1", + "doors": "T", + "secrets": 3, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 3 + }, + "soul": false, + "id": [ + "102,-240" + ], + "secret_coords": { + "chest": [ + [ + 25, + 84, + 7 + ], + [ + 5, + 69, + 28 + ], + [ + 1, + 76, + 5 + ] + ] + }, + "cores": [ + 1449723216 + ] + }, + { + "name": "Purple Flags", + "type": "mobs", + "shape": "1x2", + "secrets": 5, + "crypts": 7, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 3 + }, + "soul": false, + "id": [ + "778,-384" + ], + "secret_coords": { + "chest": [ + [ + 32, + 67, + 7 + ], + [ + 39, + 49, + 29 + ], + [ + 59, + 49, + 24 + ] + ], + "wither": [ + [ + 6, + 57, + 28 + ] + ], + "item": [ + [ + 27, + 49, + 28 + ] + ] + }, + "cores": [ + -882460923, + 579705967 + ] + }, + { + "name": "Archway", + "type": "mobs", + "shape": "1x2", + "secrets": 3, + "crypts": 4, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 2, + "chest": 1 + }, + "soul": false, + "id": [ + "574,-384" + ], + "secret_coords": { + "chest": [ + [ + 1, + 70, + 2 + ] + ], + "item": [ + [ + 10, + 85, + 27 + ], + [ + 54, + 89, + 12 + ] + ] + }, + "cores": [ + -1347995106, + 123603633 + ] + }, + { + "name": "Mage", + "type": "mobs", + "shape": "1x2", + "secrets": 4, + "crypts": 0, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "506,-384" + ], + "secret_coords": { + "chest": [ + [ + 16, + 70, + 17 + ], + [ + 42, + 62, + 15 + ] + ], + "bat": [ + [ + 57, + 83, + 7 + ] + ], + "wither": [ + [ + 58, + 82, + 5 + ] + ] + }, + "cores": [ + 1089356068, + -338946136 + ] + }, + { + "name": "Grass Ruin", + "type": "mobs", + "shape": "1x2", + "secrets": 3, + "crypts": 4, + "revive_stones": 1, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "1322,-384" + ], + "secret_coords": { + "chest": [ + [ + 3, + 55, + 14 + ], + [ + 11, + 107, + 10 + ] + ], + "wither": [ + [ + 48, + 81, + 24 + ] + ] + }, + "cores": [ + 568565222, + -786211724, + 897663506, + 836101299 + ] + }, + { + "name": "Grand Library", + "type": "mobs", + "shape": "1x2", + "secrets": 4, + "crypts": 2, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 2 + }, + "soul": false, + "id": [ + "1526,-384" + ], + "secret_coords": { + "wither": [ + [ + 6, + 80, + 3 + ] + ], + "chest": [ + [ + 23, + 93, + 2 + ], + [ + 31, + 58, + 15 + ] + ], + "item": [ + [ + 28, + 57, + 18 + ] + ] + }, + "cores": [ + 749593273, + -1617288919, + 923008201, + 1793262069, + 1402857129, + -117781590, + 1843550199, + -1252862312, + -1341182153, + -1329426456, + 1755230358, + -1829961912, + -1741792170, + -323086122, + 436826935, + -997825687, + -231812216 + ] + }, + { + "name": "Pit", + "type": "mobs", + "shape": "1x4", + "secrets": 5, + "crypts": 4, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 3 + }, + "soul": false, + "id": [ + "690,-456" + ], + "secret_coords": { + "chest": [ + [ + 113, + 92, + 28 + ], + [ + 7, + 65, + 7 + ], + [ + 20, + 91, + 9 + ] + ], + "bat": [ + [ + 9, + 78, + 27 + ] + ], + "item": [ + [ + 3, + 76, + 26 + ] + ] + }, + "cores": [ + -1862968316, + -258250108, + 265221970, + 430079089, + -1036399914 + ] + }, + { + "name": "Atlas", + "type": "mobs", + "shape": "2x2", + "secrets": 6, + "crypts": 5, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 3 + }, + "soul": false, + "id": [ + "778,-592" + ], + "secret_coords": { + "wither": [ + [ + 38, + 78, + 4 + ] + ], + "chest": [ + [ + 36, + 57, + 15 + ], + [ + 31, + 78, + 52 + ], + [ + 11, + 82, + 31 + ] + ], + "bat": [ + [ + 5, + 72, + 57 + ] + ], + "item": [ + [ + 55, + 76, + 28 + ] + ] + }, + "cores": [ + -685489527, + -38388847, + 308515062, + 745093020 + ] + }, + { + "name": "Layers", + "type": "mobs", + "shape": "L", + "secrets": 8, + "crypts": 3, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 4, + "chest": 4 + }, + "soul": false, + "id": [ + "1050,-524" + ], + "secret_coords": { + "item": [ + [ + 25, + 70, + 28 + ], + [ + 35, + 59, + 51 + ], + [ + 47, + 79, + 34 + ], + [ + 7, + 96, + 56 + ] + ], + "chest": [ + [ + 5, + 69, + 2 + ], + [ + 13, + 69, + 26 + ], + [ + 47, + 69, + 47 + ], + [ + 54, + 78, + 56 + ] + ] + }, + "cores": [ + 820948152, + 1516049261, + -1910037748, + 1695415401 + ] + }, + { + "name": "Waterfall", + "type": "mobs", + "shape": "1x4", + "secrets": 8, + "crypts": 3, + "revive_stones": 1, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 2, + "item": 1, + "chest": 5 + }, + "soul": false, + "id": [ + "822,-456" + ], + "secret_coords": { + "item": [ + [ + 8, + 44, + 28 + ] + ], + "chest": [ + [ + 34, + 84, + 23 + ], + [ + 121, + 81, + 15 + ], + [ + 82, + 78, + 3 + ], + [ + 42, + 82, + 21 + ], + [ + 53, + 44, + 27 + ] + ], + "bat": [ + [ + 70, + 61, + 3 + ], + [ + 88, + 46, + 27 + ] + ] + }, + "cores": [ + 740310812, + 82232284, + 1379043687, + -1971268623 + ] + }, + { + "name": "Pressure Plates", + "type": "mobs", + "shape": "1x2", + "secrets": 6, + "crypts": 6, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 2, + "chest": 4 + }, + "soul": false, + "id": [ + "1186,-384" + ], + "secret_coords": { + "item": [ + [ + 4, + 70, + 23 + ], + [ + 57, + 69, + 7 + ] + ], + "chest": [ + [ + 20, + 70, + 15 + ], + [ + 23, + 59, + 7 + ], + [ + 59, + 94, + 15 + ], + [ + 60, + 94, + 7 + ] + ] + }, + "cores": [ + 1172966775, + 681797038 + ] + }, + { + "name": "Supertall", + "type": "miniboss", + "shape": "2x2", + "secrets": 6, + "crypts": 6, + "revive_stones": 2, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 2, + "item": 1, + "chest": 3 + }, + "soul": true, + "id": [ + "642,-592" + ], + "secret_coords": { + "bat": [ + [ + 2, + 72, + 2 + ], + [ + 53, + 112, + 8 + ] + ], + "chest": [ + [ + 36, + 142, + 51 + ], + [ + 31, + 142, + 56 + ], + [ + 26, + 142, + 51 + ] + ], + "item": [ + [ + 31, + 102, + 53 + ] + ] + }, + "cores": [ + -46683467, + 291711773, + 1522346451, + -1376632689 + ] + }, + { + "name": "Gravel", + "type": "miniboss", + "shape": "1x3", + "secrets": 6, + "crypts": 2, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 2, + "redstone_key": 0, + "bat": 1, + "item": 2, + "chest": 1 + }, + "soul": false, + "id": [ + "30,-420" + ], + "secret_coords": { + "chest": [ + [ + 35, + 69, + 11 + ] + ], + "bat": [ + [ + 37, + 91, + 14 + ] + ], + "item": [ + [ + 87, + 69, + 8 + ], + [ + 67, + 87, + 12 + ] + ], + "wither": [ + [ + 92, + 69, + 3 + ], + [ + 66, + 87, + 14 + ] + ] + }, + "cores": [ + 4304131, + 1127962661, + 841898152 + ] + }, + { + "name": "Cathedral", + "type": "miniboss", + "shape": "2x2", + "secrets": 8, + "crypts": 5, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 2, + "item": 3, + "chest": 3 + }, + "soul": false, + "id": [ + "506,-592" + ], + "secret_coords": { + "chest": [ + [ + 19, + 60, + 7 + ], + [ + 28, + 82, + 3 + ], + [ + 38, + 59, + 36 + ] + ], + "bat": [ + [ + 59, + 86, + 3 + ], + [ + 37, + 74, + 15 + ] + ], + "item": [ + [ + 49, + 59, + 23 + ], + [ + 33, + 93, + 47 + ], + [ + 20, + 90, + 44 + ] + ] + }, + "cores": [ + -2043617055, + 1956475445, + 789869846, + -1212586959 + ] + }, + { + "name": "Red Blue", + "type": "miniboss", + "shape": "1x3", + "secrets": 4, + "crypts": 1, + "revive_stones": 1, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 2 + }, + "soul": false, + "id": [ + "130,-420" + ], + "secret_coords": { + "chest": [ + [ + 57, + 70, + 5 + ], + [ + 39, + 90, + 26 + ] + ], + "wither": [ + [ + 79, + 83, + 15 + ] + ], + "item": [ + [ + 60, + 86, + 22 + ] + ] + }, + "cores": [ + 1607395895, + -1794981292, + 1011477602, + 1374070707 + ] + }, + { + "name": "Spider", + "type": "miniboss", + "shape": "L", + "secrets": 9, + "crypts": 3, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 2, + "chest": 6 + }, + "soul": false, + "id": [ + "234,-524" + ], + "secret_coords": { + "chest": [ + [ + 28, + 50, + 4 + ], + [ + 22, + 28, + 40 + ], + [ + 49, + 84, + 36 + ], + [ + 10, + 83, + 56 + ], + [ + 15, + 92, + 31 + ], + [ + 27, + 84, + 32 + ] + ], + "bat": [ + [ + 55, + 86, + 35 + ] + ], + "item": [ + [ + 26, + 91, + 39 + ], + [ + 24, + 92, + 34 + ] + ] + }, + "cores": [ + -1361285742, + 365045229, + 1778566373 + ] + }, + { + "name": "Deathmite", + "type": "miniboss", + "shape": "1x3", + "secrets": 6, + "crypts": 4, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 4 + }, + "soul": false, + "id": [ + "730,-420" + ], + "secret_coords": { + "chest": [ + [ + 12, + 69, + 15 + ], + [ + 83, + 92, + 27 + ], + [ + 67, + 82, + 15 + ] + ], + "bat": [ + [ + 83, + 98, + 26 + ] + ], + "item": [ + [ + 88, + 69, + 6 + ] + ] + }, + "cores": [ + -233562612, + -1901273450, + -1408070175, + 295356427 + ] + }, + { + "name": "Museum", + "type": "miniboss", + "shape": "2x2", + "secrets": 5, + "crypts": 4, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 4 + }, + "soul": false, + "id": [ + "846,-592" + ], + "secret_coords": { + "chest": [ + [ + 31, + 70, + 60 + ], + [ + 34, + 83, + 11 + ], + [ + 31, + 70, + 9 + ], + [ + 48, + 62, + 6 + ] + ], + "wither": [ + [ + 42, + 93, + 53 + ] + ] + }, + "cores": [ + 1514395908, + -1797804860, + -1957538226, + -2121384577 + ] + }, + { + "name": "Market", + "type": "miniboss", + "shape": "L", + "secrets": 5, + "crypts": 4, + "revive_stones": 1, + "journals": 0, + "spiders": true, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 3 + }, + "soul": false, + "id": [ + "574,-524" + ], + "secret_coords": { + "chest": [ + [ + 16, + 86, + 56 + ], + [ + 32, + 61, + 48 + ], + [ + 46, + 79, + 48 + ] + ], + "wither": [ + [ + 7, + 59, + 44 + ] + ], + "bat": [ + [ + 12, + 62, + 47 + ] + ] + }, + "cores": [ + 270637140, + -402574914, + -880417926, + -335046406 + ] + }, + { + "name": "Melon", + "type": "miniboss", + "shape": "L", + "secrets": 7, + "crypts": 4, + "revive_stones": 0, + "journals": 0, + "spiders": true, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 6 + }, + "soul": false, + "id": [ + "166,-524" + ], + "secret_coords": { + "chest": [ + [ + 59, + 69, + 58 + ], + [ + 41, + 85, + 56 + ], + [ + 33, + 80, + 53 + ], + [ + 15, + 69, + 35 + ], + [ + 26, + 79, + 1 + ], + [ + 5, + 82, + 4 + ] + ], + "bat": [ + [ + 7, + 76, + 27 + ] + ] + }, + "cores": [ + 158528145, + 1964904676, + -325025964 + ] + }, + { + "name": "Mossy", + "type": "miniboss", + "shape": "1x4", + "secrets": 4, + "crypts": 2, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 3 + }, + "soul": true, + "id": [ + "30,-456" + ], + "secret_coords": { + "chest": [ + [ + 2, + 69, + 4 + ], + [ + 63, + 95, + 15 + ], + [ + 47, + 89, + 4 + ] + ], + "bat": [ + [ + 72, + 87, + 11 + ] + ] + }, + "cores": [ + -1169615458, + 1432034198, + 1896208123 + ] + }, + { + "name": "Flags", + "type": "miniboss", + "shape": "2x2", + "secrets": 7, + "crypts": 8, + "revive_stones": 1, + "journals": 0, + "spiders": true, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 5 + }, + "soul": false, + "id": [ + "574,-592" + ], + "secret_coords": { + "chest": [ + [ + 37, + 67, + 58 + ], + [ + 11, + 97, + 7 + ], + [ + 14, + 108, + 27 + ], + [ + 14, + 108, + 41 + ], + [ + 59, + 87, + 41 + ] + ], + "bat": [ + [ + 52, + 77, + 38 + ] + ], + "item": [ + [ + 53, + 69, + 23 + ] + ] + }, + "cores": [ + 284566079, + 1157102457, + -1267948931, + 67929126 + ] + }, + { + "name": "Well", + "type": "miniboss", + "shape": "L", + "secrets": 7, + "crypts": 5, + "revive_stones": 0, + "journals": 0, + "spiders": true, + "secret_details": { + "wither": 2, + "redstone_key": 0, + "bat": 0, + "item": 2, + "chest": 3 + }, + "soul": false, + "id": [ + "438,-524" + ], + "secret_coords": { + "item": [ + [ + 14, + 57, + 15 + ], + [ + 59, + 91, + 35 + ] + ], + "wither": [ + [ + 2, + 95, + 59 + ], + [ + 7, + 95, + 56 + ] + ], + "chest": [ + [ + 11, + 88, + 50 + ], + [ + 18, + 91, + 25 + ], + [ + 60, + 89, + 47 + ] + ] + }, + "cores": [ + 718434953, + 196766004, + 1955671195 + ] + }, + { + "id": [ + "162,-456" + ], + "name": "Hallway", + "type": "miniboss", + "shape": "1x4", + "secrets": 3, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 3 + }, + "soul": false, + "secret_coords": { + "chest": [ + [ + 28, + 69, + 3 + ], + [ + 54, + 69, + 5 + ], + [ + 85, + 85, + 6 + ] + ] + }, + "cores": [ + -1644671806, + -1723662179, + 351544339, + -402028497 + ] + }, + { + "id": [ + "230,-420" + ], + "name": "Diagonal", + "type": "miniboss", + "shape": "1x3", + "secrets": 4, + "crypts": 3, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 3 + }, + "soul": true, + "secret_coords": { + "chest": [ + [ + 90, + 77, + 14 + ], + [ + 69, + 60, + 29 + ], + [ + 11, + 60, + 9 + ] + ], + "bat": [ + [ + 32, + 72, + 5 + ] + ] + }, + "cores": [ + 1927292233, + -277536236, + -464769223 + ] + }, + { + "name": "Catwalk", + "type": "miniboss", + "shape": "1x3", + "secrets": 6, + "crypts": 5, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 4 + }, + "soul": false, + "id": [ + "630,-420" + ], + "secret_coords": { + "chest": [ + [ + 24, + 63, + 27 + ], + [ + 24, + 50, + 15 + ], + [ + 89, + 49, + 18 + ], + [ + 84, + 63, + 14 + ] + ], + "item": [ + [ + 80, + 50, + 6 + ] + ], + "wither": [ + [ + 80, + 50, + 8 + ] + ] + }, + "cores": [ + -1694830065, + -1010346133, + 1600132124 + ] + }, + { + "name": "Dino Site", + "type": "miniboss", + "shape": "L", + "secrets": 4, + "crypts": 4, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 2 + }, + "soul": false, + "id": [ + "778,-524" + ], + "secret_coords": { + "bat": [ + [ + 9, + 48, + 34 + ] + ], + "chest": [ + [ + 54, + 52, + 51 + ], + [ + 24, + 92, + 29 + ] + ], + "item": [ + [ + 47, + 57, + 36 + ] + ] + }, + "cores": [ + -1113939414, + -1425445617, + -609789679 + ] + }, + { + "name": "Stairs", + "type": "miniboss", + "shape": "2x2", + "secrets": 4, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 3 + }, + "soul": true, + "id": [ + "234,-592" + ], + "secret_coords": { + "chest": [ + [ + 44, + 88, + 28 + ], + [ + 31, + 88, + 22 + ], + [ + 8, + 70, + 9 + ] + ], + "item": [ + [ + 37, + 86, + 36 + ] + ] + }, + "cores": [ + -330702540, + -283979980, + 606731747, + -697693183 + ] + }, + { + "id": [ + "558,-456" + ], + "name": "Quartz Knight", + "type": "miniboss", + "shape": "1x4", + "secrets": 7, + "crypts": 9, + "revive_stones": 1, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 2, + "chest": 4 + }, + "soul": false, + "secret_coords": { + "chest": [ + [ + 6, + 63, + 27 + ], + [ + 21, + 89, + 24 + ], + [ + 111, + 88, + 2 + ], + [ + 18, + 90, + 24 + ] + ], + "bat": [ + [ + 29, + 61, + 17 + ] + ], + "item": [ + [ + 66, + 84, + 5 + ], + [ + 95, + 79, + 26 + ] + ] + }, + "cores": [ + -129760550, + 153753389, + -1639566599, + -742870398 + ] + }, + { + "name": "Buttons", + "type": "miniboss", + "shape": "2x2", + "secrets": 5, + "crypts": 21, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 5 + }, + "soul": false, + "id": [ + "438,-592" + ], + "secret_coords": { + "chest": [ + [ + 57, + 69, + 60 + ], + [ + 31, + 73, + 13 + ], + [ + 2, + 81, + 50 + ], + [ + 53, + 55, + 31 + ], + [ + 56, + 81, + 2 + ] + ] + }, + "cores": [ + 160943502, + 561614439, + 823430452, + 2123177620 + ] + }, + { + "name": "Rails", + "type": "miniboss", + "shape": "2x2", + "secrets": 9, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 3, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 4 + }, + "soul": false, + "id": [ + "166,-592" + ], + "secret_coords": { + "item": [ + [ + 27, + 70, + 29 + ] + ], + "wither": [ + [ + 25, + 70, + 28 + ], + [ + 6, + 49, + 10 + ], + [ + 3, + 49, + 10 + ] + ], + "chest": [ + [ + 8, + 49, + 60 + ], + [ + 30, + 64, + 29 + ], + [ + 30, + 72, + 34 + ], + [ + 56, + 66, + 6 + ] + ], + "bat": [ + [ + 56, + 51, + 11 + ] + ] + }, + "cores": [ + 1937419120, + -1778261714, + 526587049, + -214948895 + ] + }, + { + "name": "Vinny 8 Ball", + "type": "rare", + "shape": "1x1", + "doors": "D", + "secrets": 1, + "crypts": 10, + "revive_stones": 0, + "journals": 999, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "354,-60" + ], + "cores": [ + -1169880205 + ], + "secret_coords": { + "chest": [ + [ + 26, + 69, + 17 + ] + ] + } + }, + { + "name": "Pillars", + "type": "rare", + "shape": "1x1", + "doors": "D", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "282,-60" + ], + "cores": [ + 1216268340 + ] + }, + { + "name": "Sand Dragon", + "type": "rare", + "shape": "1x1", + "doors": "D", + "secrets": 1, + "crypts": 1, + "revive_stones": 0, + "journals": 2, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "102,-60" + ], + "secret_coords": { + "chest": [ + [ + 15, + 86, + 26 + ] + ] + }, + "cores": [ + 411647167 + ] + }, + { + "name": "Tombstone", + "type": "rare", + "shape": "1x1", + "doors": "D", + "secrets": 2, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "66,-60" + ], + "cores": [ + 1965783806 + ] + }, + { + "id": [ + "30,-60" + ], + "name": "Stone Window", + "type": "rare", + "shape": "1x1", + "doors": "D", + "secrets": 2, + "crypts": 1, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 2, + "item": 0, + "chest": 0 + }, + "soul": false, + "secret_coords": { + "bat": [ + [ + 2, + 72, + 16 + ], + [ + 24, + 80, + 8 + ] + ] + }, + "cores": [ + 477318192 + ] + }, + { + "id": [ + "318,-60" + ], + "name": "Lava Pit", + "type": "rare", + "shape": "1x1", + "doors": "D", + "secrets": 3, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 2 + }, + "soul": false, + "cores": [ + 1476944647 + ] + }, + { + "name": "Lava Pit", + "type": "rare", + "shape": "1x1", + "doors": "D", + "secrets": 3, + "crypts": 1, + "revive_stones": 0, + "journals": 2, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "174,-60" + ], + "cores": [ + 1476944647 + ] + }, + { + "name": "Mini Rail Track", + "type": "rare", + "shape": "1x1", + "doors": "D", + "secrets": 3, + "crypts": 3, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 2, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "210,-60" + ], + "secret_coords": { + "bat": [ + [ + 20, + 72, + 10 + ], + [ + 6, + 82, + 21 + ] + ], + "chest": [ + [ + 28, + 63, + 7 + ] + ] + }, + "cores": [ + -701175845 + ] + }, + { + "name": "Carpets", + "type": "mobs", + "shape": "1x1", + "doors": "X", + "secrets": 1, + "crypts": 3, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "570,-312" + ], + "secret_coords": { + "chest": [ + [ + 15, + 85, + 15 + ] + ] + }, + "cores": [ + -1160833644, + 1250937585 + ] + }, + { + "name": "Trinity", + "type": "rare", + "shape": "1x1", + "doors": "D", + "secrets": 4, + "crypts": 0, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 2, + "item": 1, + "chest": 1 + }, + "soul": false, + "id": [ + "246,-60" + ], + "secret_coords": { + "item": [ + [ + 7, + 74, + 27 + ] + ], + "bat": [ + [ + 2, + 94, + 26 + ], + [ + 8, + 87, + 18 + ] + ], + "chest": [ + [ + 14, + 75, + 27 + ] + ] + }, + "cores": [ + 256380076 + ] + }, + { + "name": "Hanging Vines", + "type": "rare", + "shape": "1x1", + "doors": "D", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 1, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "138,-60" + ], + "cores": [ + 467751445 + ] + }, + { + "name": "Miniboss", + "type": "gold", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "174,66", + "246,102", + "210,66" + ], + "cores": [ + 652570347, + 1956609103 + ] + }, + { + "name": "King Midas", + "type": "gold", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "210,102" + ], + "cores": [ + -1678546839 + ] + }, + { + "name": "Shadow Assassin", + "type": "gold", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 2, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "318,66" + ], + "cores": [ + -430117371 + ] + }, + { + "name": "Three Weirdos", + "type": "puzzle", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "-60,-96" + ], + "cores": [ + -476788643 + ] + }, + { + "name": "Water Board", + "type": "puzzle", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "-60,-60" + ], + "cores": [ + -109725212, + -353291158, + 2014437159, + -325964637, + -1489069695, + -1732086817, + -714138899, + -1663643617, + 307295840, + -685683836, + -1275467687, + 1335854055 + ] + }, + { + "name": "Ice Fill", + "type": "puzzle", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "-132,-492" + ], + "cores": [ + 2051424561, + 1262122263, + 1673994041, + 884728242 + ] + }, + { + "name": "Creeper Beams", + "type": "puzzle", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "-60,-528" + ], + "cores": [ + 787281630, + -166947265, + 1062329762 + ] + }, + { + "name": "Teleport Maze", + "type": "puzzle", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "-60,-456" + ], + "cores": [ + 2089453469 + ] + }, + { + "name": "Blaze", + "type": "puzzle", + "shape": "1x1", + "doors": "D", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "-60,-204", + "-96,-204" + ], + "secret_coords": { + "chest": [ + [ + 2, + 68, + 27 + ], + [ + 2, + 118, + 27 + ] + ] + }, + "cores": [ + -2089908593, + 461958223 + ] + }, + { + "name": "Quiz", + "type": "puzzle", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "-60,-600" + ], + "cores": [ + 1928619293 + ] + }, + { + "id": [ + "-96,-168" + ], + "name": "Tic Tac Toe", + "type": "puzzle", + "shape": "1x1", + "doors": "D", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "secret_coords": { + "chest": [ + [ + 9, + 69, + 25 + ] + ] + }, + "cores": [ + 1958698161 + ] + }, + { + "name": "Bomb Defuse", + "type": "puzzle", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "-60,-636" + ], + "cores": [ + 86014075 + ] + }, + { + "name": "Boulder", + "type": "puzzle", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "-60,-564" + ], + "cores": [ + 632136981, + 307825200, + -267112000, + -591423781 + ] + }, + { + "name": "Ice Path", + "type": "puzzle", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "-60,-276" + ], + "cores": [ + 1073658098 + ] + }, + { + "name": "New Trap", + "type": "trap", + "shape": "1x1", + "doors": "D", + "secrets": 3, + "crypts": 1, + "revive_stones": 0, + "journals": 0, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 2 + }, + "soul": false, + "id": [ + "-384,30", + "-348,30" + ], + "secret_coords": { + "bat": [ + [ + 21, + 92, + 21 + ] + ], + "chest": [ + [ + 26, + 90, + 14 + ], + [ + 5, + 67, + 12 + ] + ] + }, + "cores": [ + -1358669872, + 1628378960, + -1989128497, + 997920335 + ] + }, + { + "name": "Old Trap", + "type": "trap", + "shape": "1x1", + "doors": "D", + "secrets": 4, + "crypts": 2, + "revive_stones": 0, + "journals": 0, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 3 + }, + "soul": false, + "id": [ + "-312,30" + ], + "secret_coords": { + "chest": [ + [ + 26, + 83, + 4 + ], + [ + 23, + 90, + 17 + ], + [ + 4, + 71, + 9 + ] + ], + "bat": [ + [ + 22, + 90, + 9 + ] + ] + }, + "cores": [ + 1128554492, + -625336388 + ] + }, + { + "name": "Blood", + "type": "blood", + "shape": "1x1", + "doors": "D", + "secrets": 0, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "soul": false, + "id": [ + "354,66", + "138,30", + "138,66" + ], + "cores": [ + 1088349648 + ] + }, + { + "name": "Fairy", + "type": "fairy", + "shape": "1x1", + "doors": "V", + "secrets": 0, + "crypts": 0, + "revive_stones": 4, + "journals": 0, + "soul": false, + "id": [ + "462,-312" + ], + "cores": [ + 1484567748 + ] + }, + { + "name": "Altar", + "type": "mobs", + "shape": "L", + "secrets": 6, + "crypts": 3, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 3 + }, + "journals": 0, + "soul": false, + "id": [ + "846,-524" + ], + "secret_coords": { + "item": [ + [ + 14, + 71, + 48 + ] + ], + "chest": [ + [ + 51, + 88, + 45 + ], + [ + 19, + 83, + 43 + ], + [ + 11, + 44, + 39 + ] + ], + "wither": [ + [ + 17, + 93, + 27 + ] + ], + "bat": [ + [ + 36, + 55, + 35 + ] + ] + }, + "cores": [ + -1056592577, + 1823952110, + -1690727070 + ] + }, + { + "name": "Pirate", + "type": "mobs", + "shape": "L", + "secrets": 6, + "crypts": 2, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 3 + }, + "journals": 0, + "soul": false, + "id": [ + "914,-524" + ], + "secret_coords": { + "wither": [ + [ + 19, + 60, + 4 + ] + ], + "chest": [ + [ + 17, + 83, + 60 + ], + [ + 46, + 84, + 57 + ], + [ + 15, + 60, + 46 + ] + ], + "bat": [ + [ + 15, + 63, + 45 + ] + ], + "item": [ + [ + 4, + 60, + 58 + ] + ] + }, + "cores": [ + -1175423677, + 1942933815, + 2002468229 + ] + }, + { + "name": "Criss Cross", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 1, + "crypts": 6, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "journals": 0, + "soul": false, + "id": [ + "714,-168" + ], + "secret_coords": { + "chest": [ + [ + 15, + 66, + 6 + ] + ] + }, + "cores": [ + 650161016 + ] + }, + { + "name": "Ritual", + "type": "mobs", + "shape": "1x1", + "doors": "I", + "secrets": 3, + "crypts": 1, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 0, + "chest": 2 + }, + "journals": 0, + "soul": false, + "id": [ + "822,-168" + ], + "secret_coords": { + "chest": [ + [ + 15, + 80, + 3 + ], + [ + 27, + 69, + 2 + ] + ], + "bat": [ + [ + 15, + 86, + 25 + ] + ] + }, + "cores": [ + 758637731 + ] + }, + { + "name": "Pipes", + "type": "mobs", + "shape": "1x4", + "secrets": 7, + "crypts": 9, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 1, + "item": 1, + "chest": 5 + }, + "journals": 0, + "soul": false, + "id": [ + "954,-456" + ], + "secret_coords": { + "chest": [ + [ + 107, + 45, + 15 + ], + [ + 63, + 55, + 26 + ], + [ + 119, + 54, + 5 + ], + [ + 7, + 42, + 3 + ], + [ + 117, + 62, + 26 + ] + ], + "item": [ + [ + 49, + 32, + 6 + ] + ], + "bat": [ + [ + 122, + 57, + 19 + ] + ] + }, + "cores": [ + 952529534, + -901820944, + -664950032, + -2024067702 + ] + }, + { + "name": "Slime", + "type": "mobs", + "shape": "1x3", + "secrets": 5, + "crypts": 1, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 1, + "item": 2, + "chest": 1 + }, + "journals": 1, + "soul": false, + "id": [ + "830,-420" + ], + "secret_coords": { + "item": [ + [ + 3, + 86, + 10 + ], + [ + 90, + 57, + 15 + ] + ], + "wither": [ + [ + 20, + 86, + 15 + ] + ], + "bat": [ + [ + 14, + 52, + 14 + ] + ], + "chest": [ + [ + 29, + 87, + 14 + ] + ] + }, + "cores": [ + -1050545277, + 611794931, + 1203689085 + ] + }, + { + "name": "Redstone Crypt", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 3, + "crypts": 0, + "secret_details": { + "wither": 0, + "redstone_key": 1, + "bat": 0, + "item": 0, + "chest": 2 + }, + "journals": 0, + "soul": false, + "id": [ + "606,-96" + ], + "secret_coords": { + "chest": [ + [ + 9, + 69, + 3 + ], + [ + 29, + 70, + 15 + ] + ], + "redstone_key": [ + [ + 4, + 71, + 4 + ] + ] + }, + "cores": [ + 127199896, + -1054702517, + 1039011083 + ] + }, + { + "name": "Staircase", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 3, + "crypts": 2, + "secret_details": { + "wither": 1, + "redstone_key": 0, + "bat": 0, + "item": 1, + "chest": 1 + }, + "journals": 0, + "soul": false, + "id": [ + "570,-96" + ], + "secret_coords": { + "chest": [ + [ + 28, + 66, + 3 + ] + ], + "item": [ + [ + 12, + 78, + 26 + ] + ], + "wither": [ + [ + 22, + 75, + 2 + ] + ] + }, + "cores": [ + 1386509425 + ] + }, + { + "name": "Zodd", + "type": "mobs", + "shape": "1x1", + "doors": "L", + "secrets": 1, + "crypts": 0, + "revive_stones": 0, + "journals": 0, + "spiders": false, + "secret_details": { + "wither": 0, + "redstone_key": 0, + "bat": 0, + "item": 0, + "chest": 1 + }, + "soul": false, + "id": [ + "714,-96" + ], + "secret_coords": { + "chest": [ + [ + 7, + 70, + 3 + ] + ] + }, + "cores": [ + 105458531 + ] + } +] \ No newline at end of file diff --git a/Extra/Events/SecretTracker.js b/Extra/Events/SecretTracker.js index 8b9e65f..b549c9a 100644 --- a/Extra/Events/SecretTracker.js +++ b/Extra/Events/SecretTracker.js @@ -1,4 +1,3 @@ -import { m } from "../../../mappings/mappings" import { registerForge } from "../../Utils/forgeEvents" import EventManager from "./EventManager" const EntityItem = Java.type("net.minecraft.entity.item.EntityItem") @@ -12,8 +11,8 @@ registerForge(net.minecraftforge.event.entity.EntityJoinWorldEvent, undefined, ( if (event.entity instanceof EntityItem) { let e = new Entity(event.entity) let pos = [e.getX(), e.getY(), e.getZ()] - - tempItemIdLocs.set(event.entity[m.getEntityId.Entity](), pos) + // getEntityId + tempItemIdLocs.set(event.entity.func_145782_y(), pos) } }) @@ -74,7 +73,8 @@ register("playerInteract", (action, position, event) => { }) register("packetReceived", (packet) => { - let pos = this.tempItemIdLocs.get(packet[m.getCollectedItemEntityID]()) + // getCollectedItemEntityID + let pos = this.tempItemIdLocs.get(packet.func_149354_c()) if (!pos) return // TODO: only trigger on secret iten Client.scheduleTask(() => { diff --git a/Extra/Settings/Changelog.md b/Extra/Settings/Changelog.md index 44bd478..8e412d4 100644 --- a/Extra/Settings/Changelog.md +++ b/Extra/Settings/Changelog.md @@ -135,4 +135,21 @@ First released version! @ver v1.0.15 ```diff ! Fixed score calc breaking from changed tab list +``` + +@ver v1.0.16 +```diff +! Migrated secret count api +! Fixed death counts for own player not working +``` + +@ver v1.0.17 +```diff +! Fixed player heads being wonky when the player is nicked +``` + +@ver v1.0.18 +```diff +! Fixed map not loading while holding a bow (Credits @Desco1) +! Fixed some users being unable to load assets ``` \ No newline at end of file diff --git a/Extra/Settings/SettingGui.js b/Extra/Settings/SettingGui.js index 9fc7ab8..cb177cf 100644 --- a/Extra/Settings/SettingGui.js +++ b/Extra/Settings/SettingGui.js @@ -343,15 +343,6 @@ class SettingGui { this.addToggle("Spirit leap overlay", "spiritLeapOverlay", this.currentSettings.spiritLeapOverlay)[1].setLore(["You can click on player heads in overlay!", "Most people probs wont like the design though."]) - this.addSidebarElement(new ButtonWithArrow().setText("&0Load api key from other mods").addEvent(new SoopyMouseClickEvent().setHandler(() => { - findKey(key => { - this.setApiKey(key) - }) - })), 0.3, 0.4, 0.075) - this.addSidebarElement() // Adds a gap because the button diddnt auto add one - - this.apiKeySetting = this.addHiddenString("Api key", "apiKey", this.currentSettings.apiKey)[0] - this.addToggle("Show dev info", "devInfo", this.currentSettings.devInfo) // END OF SETTINGS @@ -402,21 +393,9 @@ class SettingGui { Renderer.drawRect(Renderer.color(0, 0, 0, this.backgroundOpacity.get()), 0, 0, Renderer.screen.getWidth(), Renderer.screen.getHeight()) } - register("chat", (key, event) => { // Api key detection - ChatLib.chat(MESSAGE_PREFIX + "Copied api key!") - - this.setApiKey(key) - }).setChatCriteria("&aYour new API key is &r&b${key}&r") - this.generateChangelog() } - setApiKey(key) { - this.apiKeySetting.setText(key) - - this.changed("apiKey", key) - } - /** * Will add a gear to the right of the last added setting * @param {function():Boolean} shouldShowFun @@ -738,126 +717,6 @@ class SettingGui { export default SettingGui - -function verifyApiKeySync(key) { - if (key) { - try { - var url = "https://api.hypixel.net/key?key=" + key - let data = fetch(url).json() - - return !!data.success - } catch (e) { - return false - } - } else { - return false - } -} - -const JavaString = Java.type("java.lang.String") -const JavaLong = Java.type("java.lang.Long") -const Files = Java.type("java.nio.file.Files") -const Paths = Java.type("java.nio.file.Paths") -/** - * NOTE: this will display a notification with key finding information - */ -function findKey(callback = () => { }) { - new Thread(() => { - - // NEU - try { - let testKey = JSON.parse(new JavaString(Files.readAllBytes(Paths.get("./config/notenoughupdates/configNew.json")))).apiKey.apiKey - if (testKey) { - if (verifyApiKeySync(testKey)) { - new Notification("§aSuccess!", ["Found api key in NotEnoughUpdates!"]) - callback(testKey) - return; - } else { - console.log("[BETERMAP] Found invalid key in NotEnoughUpdates") - } - } - } catch (_) { } - - // SBE - try { - let testKey = JSON.parse(new JavaString(Files.readAllBytes(Paths.get("./config/SkyblockExtras.cfg")))).values.apiKey - if (testKey) { - if (verifyApiKeySync(testKey)) { - new Notification("§aSuccess!", ["Found api key in SkyblockExtras!"]) - callback(testKey) - return; - } else { - console.log("[BETERMAP] Found invalid key in SkyblockExtras") - } - } - } catch (_) { } - // SKYTILS - try { - let testKey2 = new JavaString(Files.readAllBytes(Paths.get("./config/skytils/config.toml"))) - let testKey = undefined - testKey2.split("\n").forEach(line => { - if (line.startsWith(" hypixel_api_key = \"")) { - testKey = line.split("\"")[1] - } - }) - if (testKey) { - if (verifyApiKeySync(testKey)) { - new Notification("§aSuccess!", ["Found api key in Skytils!"]) - callback(testKey) - return; - } else { - console.log("[BETERMAP] Found invalid key in Skytils") - } - } - } catch (_) { } - - // SOOPYADDONS DATA - try { - let testKey = FileLib.read("soopyAddonsData", "apikey.txt") - if (testKey) { - if (verifyApiKeySync(testKey)) { - new Notification("§aSuccess!", ["Found api key in old soopyaddons version!"]) - callback(testKey) - return; - } else { - console.log("[BETERMAP] Found invalid key in soopyaddonsData") - } - } - } catch (_) { } - - // SOOPYV2 - try { - let testKey = JSON.parse(FileLib.read("soopyAddonsData", "soopyaddonsbetafeaturesdata.json")).globalSettings.subSettings.api_key.value - if (testKey) { - if (verifyApiKeySync(testKey)) { - new Notification("§aSuccess!", ["Found api key in old soopyaddons version!"]) - callback(testKey) - return; - } else { - console.log("[BETERMAP] Found invalid key in soopyaddonsData") - } - } - } catch (_) { } - - // HypixelApiKeyManager - try { - let testKey = JSON.parse(FileLib.read("HypixelApiKeyManager", "localdata.json")).key - if (testKey) { - if (verifyApiKeySync(testKey)) { - new Notification("§aSuccess!", ["Found api key in HypixelApiKeyManager!"]) - callback(testKey) - return; - } else { - console.log("[BETERMAP] Found invalid key in HypixelApiKeyManager") - } - } - } catch (_) { } - - - new Notification("§cUnable to find api key", []) - }).start() -} - function isNumber(val) { if (val.includes(".")) return false val = "" + val; // Coerce num to be a string diff --git a/Extra/Settings/SettingsManager.js b/Extra/Settings/SettingsManager.js index f8d4773..65d98aa 100644 --- a/Extra/Settings/SettingsManager.js +++ b/Extra/Settings/SettingsManager.js @@ -7,6 +7,7 @@ import MapRenderer from "../../Render/MapRenderer"; import RenderContext from "../../Render/RenderContext"; import RenderContextManager from "../../Render/RenderContextManager"; import Position from "../../Utils/Position"; +import { Checkmark } from "../../Utils/Utils"; import SettingGui from "./SettingGui"; const AbstractClientPlayer = Java.type("net.minecraft.client.entity.AbstractClientPlayer") @@ -112,279 +113,63 @@ class SettingsManager { */ createFakeDungeon() { let dungeon = new DungeonMap("F7", new Set(), false); - { - let r = new Room(dungeon, 0, [new Position(-168, -200)], "102,66"); - r.currentSecrets = 0 - r.checkmarkState = 4; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-168, -168), new Position(-168, -136), new Position(-136, -136)], "1050,-524"); - r.currentSecrets = 2 - r.checkmarkState = 3; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-136, -104)], "498,-240"); - r.currentSecrets = 0 - r.checkmarkState = 3; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 2, [new Position(-104, -136)], "-60,-600"); - r.currentSecrets = 0 - r.checkmarkState = 4; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-104, -104)], "246,-60"); - r.currentSecrets = 0 - r.checkmarkState = 2; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 4, [new Position(-136, -72)], "462,-312"); - r.currentSecrets = 0 - r.checkmarkState = 4; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 5, [new Position(-200, -72)], undefined); - r.currentSecrets = undefined - r.checkmarkState = 2; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-200, -40), new Position(-168, -40), new Position(-136, -40)], "530,-420"); - r.currentSecrets = 0 - r.checkmarkState = 3; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-136, -200), new Position(-104, -200), new Position(-136, -168), new Position(-104, -168)], "166,-592"); - r.currentSecrets = 1 - r.checkmarkState = 3; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-72, -168)], "66,-276"); - r.currentSecrets = 1 - r.checkmarkState = 4; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 2, [new Position(-72, -200)], "-96,-168"); - r.currentSecrets = 0 - r.checkmarkState = 2; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-40, -168)], "66,-240"); - r.currentSecrets = 0 - r.checkmarkState = 3; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 2, [new Position(-40, -200)], "-60,-564"); - r.currentSecrets = 0 - r.checkmarkState = -1; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-72, -136), new Position(-40, -136)], "574,-384"); - r.currentSecrets = 3 - r.checkmarkState = 4; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-72, -104), new Position(-72, -72), new Position(-104, -72)], "438,-524"); - r.currentSecrets = 0 - r.checkmarkState = 2; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-40, -104), new Position(-40, -72), new Position(-40, -40)]); - r.currentSecrets = 0 - r.checkmarkState = 3; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 6, [new Position(-104, -40)], undefined); - r.currentSecrets = undefined - r.checkmarkState = 1; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 3, [new Position(-72, -40)], "174,66"); - r.currentSecrets = 0 - r.checkmarkState = 4; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-200, -200), new Position(-200, -168), new Position(-200, -136), new Position(-200, -104)], "30,-456"); - r.currentSecrets = 0 - r.checkmarkState = 3; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 1, [new Position(-168, -104)], "174,-132"); - r.currentSecrets = 0 - r.checkmarkState = 3; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let r = new Room(dungeon, 7, [new Position(-168, -72)], "-312,30"); - r.currentSecrets = 1 - r.checkmarkState = 3; - dungeon.roomsArr.add(r); - r.components.forEach(c => { - dungeon.rooms.set(c.arrayX + "," + c.arrayY, r); - }); - } - { - let d = new Door(1, new Position(-157, -173), 0); - dungeon.doors.set("-157,-173", d); - } - { - let d = new Door(1, new Position(-156.8000030517578, -172.8000030517578), false); - dungeon.doors.set("-156.8000030517578,-172.8000030517578", d); - } - { - let d = new Door(1, new Position(-172.8000030517578, -156.8000030517578), true); - dungeon.doors.set("-172.8000030517578,-156.8000030517578", d); - } - { - let d = new Door(1, new Position(-140.8000030517578, -156.8000030517578), true); - dungeon.doors.set("-140.8000030517578,-156.8000030517578", d); - } - { - let d = new Door(2, new Position(-108.80000305175781, -124.80000305175781), true); - dungeon.doors.set("-108.80000305175781,-124.80000305175781", d); - } - { - let d = new Door(1, new Position(-124.80000305175781, -108.80000305175781), false); - dungeon.doors.set("-124.80000305175781,-108.80000305175781", d); - } - { - let d = new Door(1, new Position(-108.80000305175781, -92.80000305175781), true); - dungeon.doors.set("-108.80000305175781,-92.80000305175781", d); - } - { - let d = new Door(4, new Position(-124.80000305175781, -76.80000305175781), false); - dungeon.doors.set("-124.80000305175781,-76.80000305175781", d); - } - { - let d = new Door(1, new Position(-124.80000305175781, -44.80000305175781), false); - dungeon.doors.set("-124.80000305175781,-44.80000305175781", d); - } - { - let d = new Door(5, new Position(-188.8000030517578, -44.80000305175781), false); - dungeon.doors.set("-188.8000030517578,-44.80000305175781", d); - } - { - let d = new Door(1, new Position(-76.80000305175781, -156.8000030517578), true); - dungeon.doors.set("-76.80000305175781,-156.8000030517578", d); - } - { - let d = new Door(2, new Position(-60.80000305175781, -172.8000030517578), false); - dungeon.doors.set("-60.80000305175781,-172.8000030517578", d); - } - { - let d = new Door(1, new Position(-44.80000305175781, -156.8000030517578), true); - dungeon.doors.set("-44.80000305175781,-156.8000030517578", d); - } - { - let d = new Door(2, new Position(-28.800003051757812, -172.8000030517578), false); - dungeon.doors.set("-28.800003051757812,-172.8000030517578", d); - } - { - let d = new Door(1, new Position(-28.800003051757812, -140.8000030517578), false); - dungeon.doors.set("-28.800003051757812,-140.8000030517578", d); - } - { - let d = new Door(1, new Position(-60.80000305175781, -108.80000305175781), false); - dungeon.doors.set("-60.80000305175781,-108.80000305175781", d); - } - { - let d = new Door(1, new Position(-28.800003051757812, -108.80000305175781), false); - dungeon.doors.set("-28.800003051757812,-108.80000305175781", d); - } - { - let d = new Door(6, new Position(-92.80000305175781, -44.80000305175781), false); - dungeon.doors.set("-92.80000305175781,-44.80000305175781", d); - } - { - let d = new Door(3, new Position(-60.80000305175781, -44.80000305175781), false); - dungeon.doors.set("-60.80000305175781,-44.80000305175781", d); - } - { - let d = new Door(1, new Position(-172.8000030517578, -92.80000305175781), true); - dungeon.doors.set("-172.8000030517578,-92.80000305175781", d); - } - { - let d = new Door(7, new Position(-156.8000030517578, -76.80000305175781), false); - dungeon.doors.set("-156.8000030517578,-76.80000305175781", d); - } + // [Room, secrets, checkmarkState] + const rooms = [ + [new Room(dungeon, Room.SPAWN, [new Position(-168, -200)]), 0, Checkmark.GREEN], + [new Room(dungeon, Room.NORMAL, [new Position(-168, -168), new Position(-168, -136), new Position(-136, -136)]), 2, Checkmark.WHITE], + [new Room(dungeon, Room.NORMAL, [new Position(-136, -104)]), 0, Checkmark.WHITE], + [new Room(dungeon, Room.PUZZLE, [new Position(-104, -136)]), 0, Checkmark.GREEN], + [new Room(dungeon, Room.NORMAL, [new Position(-104, -104)]), 0, Checkmark.NONE], + [new Room(dungeon, Room.FAIRY, [new Position(-136, -72)]), 0, Checkmark.GREEN], + [new Room(dungeon, Room.BLOOD, [new Position(-200, -72)]), undefined, Checkmark.NONE], + [new Room(dungeon, Room.NORMAL, [new Position(-200, -40), new Position(-168, -40), new Position(-136, -40)]), 0, Checkmark.WHITE], + [new Room(dungeon, Room.NORMAL, [new Position(-136, -200), new Position(-104, -200), new Position(-136, -168), new Position(-104, -168)]), 1, Checkmark.WHITE], + [new Room(dungeon, Room.NORMAL, [new Position(-72, -168)]), 1, Checkmark.GREEN], + [new Room(dungeon, Room.PUZZLE, [new Position(-72, -200)]), 0, Checkmark.NONE], + [new Room(dungeon, Room.NORMAL, [new Position(-40, -168)]), 0, Checkmark.WHITE], + [new Room(dungeon, Room.PUZZLE, [new Position(-40, -200)]), 0, Checkmark.FAILED], + [new Room(dungeon, Room.NORMAL, [new Position(-72, -136), new Position(-40, -136)]), 3, Checkmark.GREEN], + [new Room(dungeon, Room.NORMAL, [new Position(-72, -104), new Position(-72, -72), new Position(-104, -72)]), 0, Checkmark.NONE], + [new Room(dungeon, Room.NORMAL, [new Position(-40, -104), new Position(-40, -72), new Position(-40, -40)]), 0, Checkmark.WHITE], + [new Room(dungeon, Room.UNKNOWN, [new Position(-104, -40)]), undefined, Checkmark.GRAY], + [new Room(dungeon, Room.MINIBOSS, [new Position(-72, -40)]), 0, Checkmark.GREEN], + [new Room(dungeon, Room.NORMAL, [new Position(-200, -200), new Position(-200, -168), new Position(-200, -136), new Position(-200, -104)]), 0, Checkmark.WHITE], + [new Room(dungeon, Room.NORMAL, [new Position(-168, -104)]), 0, Checkmark.WHITE], + [new Room(dungeon, Room.TRAP, [new Position(-168, -72)]), 1, Checkmark.WHITE], + ] + rooms.forEach(([room, secrets, checkmarkState]) => { + room.secrets = secrets + room.checkmarkState = checkmarkState + dungeon.addRoom(room) + }) + + const doors = [ + new Door(Room.NORMAL, new Position(-157, -173), false), + new Door(Room.NORMAL, new Position(-156, -172), false), + new Door(Room.NORMAL, new Position(-172, -156), true), + new Door(Room.NORMAL, new Position(-140, -156), true), + new Door(Room.PUZZLE, new Position(-108, -124), true), + new Door(Room.NORMAL, new Position(-124, -108), false), + new Door(Room.NORMAL, new Position(-108, -92), true), + new Door(Room.FAIRY, new Position(-124, -76), false), + new Door(Room.NORMAL, new Position(-124, -44), false), + new Door(Room.BLOOD, new Position(-188, -44), false), + new Door(Room.NORMAL, new Position(-76, -156), true), + new Door(Room.PUZZLE, new Position(-60, -172), false), + new Door(Room.NORMAL, new Position(-44, -156), true), + new Door(Room.PUZZLE, new Position(-28, -172), false), + new Door(Room.NORMAL, new Position(-28, -140), false), + new Door(Room.NORMAL, new Position(-60, -108), false), + new Door(Room.NORMAL, new Position(-28, -108), false), + new Door(Room.UNKNOWN, new Position(-92, -44), false), + new Door(Room.MINIBOSS, new Position(-60, -44), false), + new Door(Room.NORMAL, new Position(-172, -92), true), + new Door(Room.TRAP, new Position(-156, -76), false), + ] + + doors.forEach(door => { + dungeon.doors.set(door.position.arrayStr, door) + }) return dungeon; } @@ -395,7 +180,7 @@ class SettingsManager { addPlayersToDungeonPreview(dungeon) { if (dungeon.players.length !== 0) return true - let fun = AbstractClientPlayer.class.getDeclaredMethod("func_175155_b") + let fun = AbstractClientPlayer.class.getDeclaredMethod("func_175155_b") // getPlayerInfo fun.setAccessible(true) let info = fun.invoke(Player.getPlayer()) if (!info) return false diff --git a/Render/BossMapRendering/BossMapRenderer.js b/Render/BossMapRendering/BossMapRenderer.js index 2e54d1c..4d230f5 100644 --- a/Render/BossMapRendering/BossMapRenderer.js +++ b/Render/BossMapRendering/BossMapRenderer.js @@ -7,13 +7,12 @@ class BossMapRenderer extends MapTab { constructor(mapRenderer) { super("Boss", mapRenderer) - const getBossImage = (imageName) => new Image("imgur_" + imageName, "https://i.imgur.com/" + imageName + ".png") - this.dungeonBossImages = {} new Thread(() => { let imageData = JSON.parse(FileLib.read("BetterMap", "Render/BossMapRendering/imageData.json")) Object.keys(imageData).forEach(v => { - for (let i of imageData[v]) i.image = getBossImage(i.image) + for (let i of imageData[v]) + i.image = Image.fromAsset(i.image) }) this.dungeonBossImages = imageData }).start() @@ -95,7 +94,7 @@ class BossMapRenderer extends MapTab { data.bounds[0], data.bounds[1] ] - let coords = [0,1,2].map(v => c.map(b => b[v])) // Transpose the matrix + let coords = [0, 1, 2].map(v => c.map(b => b[v])) // Transpose the matrix if (!coords.every(v => isBetween(...v))) return this.currentBossImage = data }) diff --git a/Render/BossMapRendering/imageData.json b/Render/BossMapRendering/imageData.json index 6461868..d49b804 100644 --- a/Render/BossMapRendering/imageData.json +++ b/Render/BossMapRendering/imageData.json @@ -1,7 +1,7 @@ { "1": [ { - "image": "1IwaBgM", + "image": "f1_boss.png", "bounds": [[-65, 70, -3], [-19, 90, 45]], "widthInWorld": 46, "heightInWorld": 48, @@ -10,7 +10,7 @@ ], "2": [ { - "image": "Hn1xSu3", + "image": "f2_boss.png", "bounds": [[-34, 54, -35], [18, 100, 15]], "widthInWorld": 52, "heightInWorld": 50, @@ -20,7 +20,7 @@ ], "3": [ { - "image": "h52JPEI", + "image": "f3_boss.png", "bounds": [[-33, 64, -34], [35, 118, 37]], "widthInWorld": 68, "heightInWorld": 73, @@ -30,7 +30,7 @@ ], "4": [ { - "image": "m0uqjFN", + "image": "f4_boss.png", "bounds": [[-37, 53, -37], [47, 114, 47]], "widthInWorld": 84, "heightInWorld": 84, @@ -40,7 +40,7 @@ ], "5": [ { - "image": "dCcouUx", + "image": "f5_boss.png", "bounds": [[-35, 53, -5], [45, 112, 82]], "widthInWorld": 80, "heightInWorld": 80, @@ -50,7 +50,7 @@ ], "6": [ { - "image": "C0iMHhB", + "image": "f6_boss.png", "bounds": [[-31, 51, -5], [13, 110, 94]], "widthInWorld": 44, "heightInWorld": 99, @@ -59,28 +59,28 @@ ], "7": [ { - "image": "dbRNrEM", + "image": "f7_boss_end.png", "bounds": [[14, 161, 115], [42, 189, 153]], "widthInWorld": 28, "heightInWorld": 38, "topLeftLocation": [14, 115] }, { - "image": "HO1CxQU", + "image": "f7_boss_s1.png", "bounds": [[33, 213, 11], [113, 255, 86]], "widthInWorld": 100, "heightInWorld": 75, "topLeftLocation": [33, 11] }, { - "image": "kMLGla2", + "image": "f7_boss_s2.png", "bounds": [[19, 160, -1], [127, 212, 107]], "widthInWorld": 108, "heightInWorld": 108, "topLeftLocation": [19, -1] }, { - "image": "9OjMNwt", + "image": "f7_boss_s3.png", "bounds": [[-3, 103, 29], [111, 159, 143]], "widthInWorld": 114, "heightInWorld": 114, @@ -88,14 +88,14 @@ "renderSize": 64 }, { - "image": "lCBf5Ix", + "image": "f7_boss_s4.png", "bounds": [[-3, 54, 19], [111, 102, 133]], "widthInWorld": 114, "heightInWorld": 94, "topLeftLocation": [-3, 19] }, { - "image": "TqOs3ki", + "image": "f7_boss_s5.png", "bounds": [[-5, 0, -5], [131, 53, 142]], "widthInWorld": 136, "heightInWorld": 147, diff --git a/Render/MapRenderer.js b/Render/MapRenderer.js index f14bf47..a2ee8c0 100644 --- a/Render/MapRenderer.js +++ b/Render/MapRenderer.js @@ -54,6 +54,7 @@ class MapRenderer { scoreInfoLore.push(`&fTotal score: &b${scoreInfo.total}`) scoreInfoLore.push(`&fSkill score: &a${scoreInfo.skill}`) + scoreInfoLore.push(`&fSpeed score: &a${scoreInfo.time}`) scoreInfoLore.push(`&fExploration score: &a${scoreInfo.exploration}`) scoreInfoLore.push(`&fBonus score: &a${scoreInfo.bonus}`) scoreInfoLore.push(`&f`) @@ -110,8 +111,8 @@ class MapRenderer { let mapLine1 = `${dSecrets} ${dCrypts} ${dMimic}`.trim() let mapLine2 = `${minSecrets} ${dDeaths} ${dScore}`.trim() - renderLibs.drawStringCenteredShadow(mapLine1, x + size / 2, y + size + 1, size / 220) - renderLibs.drawStringCenteredShadow(mapLine2, x + size / 2, y + size + 1 + 10 * size / 200, size / 220) + renderLibs.drawStringCenteredShadow(mapLine1, x + size / 2, y + size - 1, size / 220) + renderLibs.drawStringCenteredShadow(mapLine2, x + size / 2, y + size - 1 + 10 * size / 200, size / 220) Renderer.drawRect(Renderer.color(renderContext.settings.mapBorderColor[0] ?? 0, renderContext.settings.mapBorderColor[1] ?? 0, renderContext.settings.mapBorderColor[2] ?? 0, renderContext.settings.mapBorderColor[3]), x, y + size, renderContext.borderWidth, scoreInfoHeight) // Border of score info Renderer.drawRect(Renderer.color(renderContext.settings.mapBorderColor[0] ?? 0, renderContext.settings.mapBorderColor[1] ?? 0, renderContext.settings.mapBorderColor[2] ?? 0, renderContext.settings.mapBorderColor[3]), x + size - renderContext.borderWidth, y + size, renderContext.borderWidth, scoreInfoHeight) @@ -128,7 +129,7 @@ class MapRenderer { } if (renderContext.currentRoomInfo !== "none") { - let roomInfo = dungeonMap.getPlayerRoom()?.getLore() + let roomInfo = dungeonMap.getCurrentRoom()?.getLore() if (roomInfo) { let rx @@ -220,4 +221,4 @@ class MapRenderer { } } -export default MapRenderer \ No newline at end of file +export default MapRenderer diff --git a/Render/MapRendering/DungeonRenderer.js b/Render/MapRendering/DungeonRenderer.js index 5126a43..43ec291 100644 --- a/Render/MapRendering/DungeonRenderer.js +++ b/Render/MapRendering/DungeonRenderer.js @@ -76,7 +76,7 @@ class DungeonRenderer extends MapTab { if (!renderContext.image || (renderContext.imageLastUpdate < dungeonMap.lastChanged)) { // Create image if not cached or cache outdated - if (renderContext.image) renderContext.image.destroy() + if (renderContext.image) renderContext.image.destroy() // Causes error for some reason renderContext.image = new Image(this.createMapImage(dungeonMap, renderContext)); renderContext.imageLastUpdate = Date.now() diff --git a/Render/MapRendering/RoomRenderer.js b/Render/MapRendering/RoomRenderer.js index 1e7c956..d747c12 100644 --- a/Render/MapRendering/RoomRenderer.js +++ b/Render/MapRendering/RoomRenderer.js @@ -1,11 +1,12 @@ import renderLibs from "../../../guimanager/renderLibs.js" import Room from "../../Components/Room.js" +import { Checkmark } from "../../Utils/Utils.js" import RenderContext from "./../RenderContext.js" const barrier_block_item = new Item("minecraft:barrier") const puzzleItems = { "Water Board": new Item("minecraft:water_bucket"), - "Higher Or Lower": new Item("minecraft:blaze_powder"), + "Blaze": new Item("minecraft:blaze_powder"), "Quiz": new Item("minecraft:book"), "Three Weirdos": new Item("minecraft:chest"), "Tic Tac Toe": new Item("minecraft:shears"), @@ -18,11 +19,10 @@ const puzzleItems = { } const checkmarkStateToName = new Map() -checkmarkStateToName.set(-1, "failedRoom") -checkmarkStateToName.set(1, "questionMark") -checkmarkStateToName.set(3, "whiteCheck") -checkmarkStateToName.set(4, "greenCheck") -checkmarkStateToName.set(5, "failedRoom") +checkmarkStateToName.set(Checkmark.FAILED, "failedRoom") +checkmarkStateToName.set(Checkmark.GRAY, "questionMark") +checkmarkStateToName.set(Checkmark.WHITE, "whiteCheck") +checkmarkStateToName.set(Checkmark.GREEN, "greenCheck") const Color = Java.type('java.awt.Color'); const Font = Java.type('java.awt.Font'); @@ -81,24 +81,27 @@ class RoomRenderer { drawCheckmark(context, graphics, room) { //spawn room wont get checkmarked if (room.type === Room.SPAWN) return; + if (room.type == Room.BLOOD && room.checkmarkState == Checkmark.FAILED) return //puzzle checkmarks are drawn in drawPuzzle if (room.type === Room.PUZZLE) { if (context.puzzleNames === 'text') return; - if (context.puzzleNames === 'icon' && !(room.checkmarkState === Room.COMPLETED || room.checkmarkState === Room.FAILED)) return; + if (context.puzzleNames === 'icon' && !(room.checkmarkState === Checkmark.GREEN || room.checkmarkState === Checkmark.FAILED)) return; } else { //dont show checkmarks if all rooms are rendered by name if (context.showSecretCount === 'always') { if (!context.checkmarkCompleteRooms) return; - if (context.checkmarkCompleteRooms && room.checkmarkState !== Room.COMPLETED) return; + if (context.checkmarkCompleteRooms && room.checkmarkState !== Checkmark.GREEN) return; } if (context.showSecretCount === 'hasSecrets' && room.maxSecrets > 0) { if (!context.checkmarkCompleteRooms) return; - if (context.checkmarkCompleteRooms && room.checkmarkState !== Room.COMPLETED) return; + if (context.checkmarkCompleteRooms && room.checkmarkState !== Checkmark.GREEN) return; } } //room names are rendered in drawExtras if (context.tickStyle === 'roomnames') return; + if (room.checkmarkState == Checkmark.NONE) return + let location = [room.components[0].arrayX, room.components[0].arrayY]; if (context.centerCheckmarks) { @@ -123,20 +126,19 @@ class RoomRenderer { let fontSize = 24 * context.iconScale / 10 || 24; let teniosFont = new Font('Dialog', Font.BOLD, fontSize); graphics.setFont(teniosFont); - if (room.checkmarkState >= Room.CLEARED) { - if (room.checkmarkState >= Room.COMPLETED) { + if (room.checkmarkState >= Checkmark.WHITE) { + if (room.checkmarkState >= Checkmark.GREEN) { graphics.setColor(green); } else { graphics.setColor(gray); } graphics.drawString('✔', location[0] * context.blockSize + (context.roomSize - fontSize) / 2 + 4, location[1] * context.blockSize + context.roomSize - (context.roomSize - fontSize) / 2); - } else if (room.checkmarkState === Room.ADJACENT) { + } else if (room.checkmarkState === Checkmark.NONE) { graphics.setColor(black); graphics.drawString('?', location[0] * context.blockSize + context.roomSize / 3 * 2 - fontSize / 3 - 1, location[1] * context.blockSize + context.roomSize - (context.roomSize - fontSize) / 2); } //checkmark done - if (room.checkmarkState !== Room.FAILED) - return; + if (room.checkmarkState !== Checkmark.FAILED) return; } const getX = (w) => (context.roomGap + context.roomSize - w) / 2 + context.blockSize * location[0] @@ -165,17 +167,17 @@ class RoomRenderer { let scale = context.size / 250 * context.iconScale / 8 let textScale = context.size / 250 * context.textScale / 8 - if (context.puzzleNames === "text" || (context.puzzleNames === 'icon' && context.tickStyle === 'roomnames' && (room.checkmarkState === Room.COMPLETED || room.checkmarkState === Room.FAILED)) || context.puzzleNames === 'none' && context.tickStyle === 'roomnames') { - let text = room.data?.name?.split(" ") || ["???"] + if (context.puzzleNames === "text" || (context.puzzleNames === 'icon' && context.tickStyle === 'roomnames' && (room.checkmarkState === Checkmark.GREEN || room.checkmarkState === Checkmark.FAILED)) || context.puzzleNames === 'none' && context.tickStyle === 'roomnames') { + let text = room.name?.split(" ") || ["???"] let textColor = "" switch (room.checkmarkState) { - case Room.CLEARED: + case Checkmark.WHITE: textColor = "&f" break; - case Room.COMPLETED: + case Checkmark.GREEN: textColor = "&a" break; - case Room.FAILED: + case Checkmark.FAILED: textColor = "&c" break; default: @@ -203,8 +205,8 @@ class RoomRenderer { } else if (context.puzzleNames === "icon") { if (context.tickStyle === 'secrets') return; //dont draw icons if checkmark or fail - if (room.checkmarkState === Room.FAILED || room.checkmarkState === Room.COMPLETED) return; - let icon = puzzleItems[room.data?.name] || barrier_block_item + if (room.checkmarkState === Checkmark.FAILED || room.checkmarkState === Checkmark.GREEN) return; + let icon = puzzleItems[room.name] || barrier_block_item let iconScale = scale * 1.75 icon.draw(x - 8 * iconScale, y - 8 * iconScale, iconScale) @@ -222,7 +224,7 @@ class RoomRenderer { drawSecretCount = (location) => { if (context.showSecretCount === 'never') return; - if (context.checkmarkCompleteRooms && room.checkmarkState === Room.COMPLETED) return; + if (context.checkmarkCompleteRooms && room.checkmarkState === Checkmark.GREEN) return; if (context.showSecretCount === 'hasSecrets' && !room.maxSecrets > 0) return; let x = (context.roomGap / 2 + context.blockSize * location[0] + context.roomSize / 2 + context.borderWidth + context.paddingLeft) / context.getImageSize(dungeon.floor) @@ -241,19 +243,19 @@ class RoomRenderer { let textColored = "" switch (room.checkmarkState) { - case Room.ADJACENT: + case Checkmark.NONE: textColored = (context.mapStyle === 'teniosmap' ? "&0" : "&7") + text break; - case Room.CLEARED: + case Checkmark.WHITE: textColored = "&f" + text break; - case Room.COMPLETED: + case Checkmark.GREEN: textColored = "&a" + text break; - case Room.FAILED: + case Checkmark.FAILED: textColored = "&c" + text break; - case Room.OPENED: + case Checkmark.NONE: default: textColored = (context.mapStyle === 'teniosmap' ? "&0" : "&8") + text break; @@ -279,10 +281,10 @@ class RoomRenderer { if (context.tickStyle !== 'roomnames') return; if (context.showSecretCount === 'always') { if (!context.checkmarkCompleteRooms) return; - if (context.checkmarkCompleteRooms && room.checkmarkState !== Room.COMPLETED) return; + if (context.checkmarkCompleteRooms && room.checkmarkState !== Checkmark.GREEN) return; } if (context.showSecretCount === 'hasSecrets') { - if (room.maxSecrets > 0 && (!context.checkmarkCompleteRooms || room.checkmarkState !== Room.COMPLETED)) return; + if (room.maxSecrets > 0 && (!context.checkmarkCompleteRooms || room.checkmarkState !== Checkmark.GREEN)) return; } let x = (context.roomGap / 2 + context.blockSize * location[0] + context.roomSize / 2 + context.borderWidth + context.paddingLeft) / context.getImageSize(dungeon.floor) @@ -292,16 +294,16 @@ class RoomRenderer { y = context.posY + y * (context.size - context.borderWidth) + context.borderWidth let scale = context.size / 250 * context.textScale / 8 - let text = room.data?.name?.split(" ") || ["???"] + let text = room.name?.split(" ") || ["???"] let textColor = "" switch (room.checkmarkState) { - case Room.CLEARED: + case Checkmark.WHITE: textColor = "&f" break; - case Room.COMPLETED: + case Checkmark.GREEN: textColor = "&a" break; - case Room.FAILED: + case Checkmark.FAILED: textColor = "&c" break; default: @@ -360,7 +362,8 @@ class RoomRenderer { getRenderColor(context, room) { if (context.mapStyle === 'teniosmap') { return context.colorMap.get(room.data?.type || teniosRoomMap[room.type]) - } else if (context.mapStyle === 'custom') { + } + if (context.mapStyle === 'custom') { switch (room.data?.type || teniosRoomMap[room.type]) { case 'spawn': return new Color(Renderer.color(...context.customRoomColorSpawn), true); case 'mobs': return new Color(Renderer.color(...context.customRoomColorNormal), true); @@ -376,9 +379,10 @@ class RoomRenderer { case 'unknown': return new Color(Renderer.color(...context.customRoomColorUnknown), true); } } - else { - return context.colorMap.get(room.type) - } + + if (!context.colorMap.has(room.type)) return new Color(Renderer.color(107, 58, 17, 255)) + + return context.colorMap.get(room.type) } } diff --git a/Render/RenderContext.js b/Render/RenderContext.js index 54fc602..c7a5326 100644 --- a/Render/RenderContext.js +++ b/Render/RenderContext.js @@ -35,7 +35,6 @@ * @property {Boolean} spiritLeapOverlay - Show an overlay on the spirit leap gui * @property {Boolean} forcePaul - Wether to force enable the +10 score for paul (eg if jerry mayor) * @property {Boolean} clearedRoomInfo - Show a summory of what rooms people cleared after run finishes - * @property {String} apiKey - The user's api key, or "" if unknown * @property {Boolean} devInfo - Wether to show def info in various places in the map * @property {[r:Number, g:Number, b:Number, a:number]} mapBorderColor - The RGBO value of the map border color * @property {[r:Number, g:Number, b:Number, a:number]} mapBackgroundColor - The RGBO value of the map backround color @@ -204,10 +203,6 @@ class RenderContext { return this.settings.boxDoors } - get apiKey() { - return this.settings.apiKey - } - get devInfo() { return this.settings.devInfo } @@ -449,7 +444,6 @@ class RenderContext { spiritLeapOverlay = false, forcePaul = false, clearedRoomInfo = true, - apiKey = "", devInfo = false, boxDoors = true, mapBorderColor = [0, 0, 0, 255], @@ -511,7 +505,6 @@ class RenderContext { spiritLeapOverlay, forcePaul, clearedRoomInfo, - apiKey, devInfo, boxDoors, mapBorderColor, @@ -556,7 +549,8 @@ class RenderContext { * Prepairs this render context for garbage collection, eg clearing cached map image from memory */ destroy() { - this.image?.getTexture()?.[m.deleteGlTexture]() + // deleteGlTexture + this.image?.getTexture()?.func_147631_c() this.image = undefined this.onDestroys.forEach(fun => fun()) @@ -588,7 +582,7 @@ let roomHash = { UNKNOWN: 6, TRAP: 7, BLACK: 8, // For rendering wither doors - NORMAL_CONNECTION: 9 // For rendering connections between normal rooms + NORMAL_CONNECTION: 9, // For rendering connections between normal rooms } const Color = Java.type("java.awt.Color") @@ -633,19 +627,19 @@ TeniosMapColorMap.set('unknown', new Color(Renderer.color(64, 64, 64))); TeniosMapColorMap.set('wither', new Color(Renderer.color(0, 0, 0))); const HypixelTicksOld = new Map() -HypixelTicksOld.set("greenCheck", new Image("greenCheckVanilla-old.png", "https://i.imgur.com/h2WM1LO.png").image) -HypixelTicksOld.set("whiteCheck", new Image("whiteCheckVanilla-old.png", "https://i.imgur.com/hwEAcnI.png").image) -HypixelTicksOld.set("failedRoom", new Image("failedRoomVanilla.png", "https://i.imgur.com/WqW69z3.png").image) -HypixelTicksOld.set("questionMark", new Image("questionMarkVanilla-old.png", "https://i.imgur.com/1jyxH9I.png").image) +HypixelTicksOld.set("greenCheck", Image.fromAsset("greenCheckVanilla-old.png").image) +HypixelTicksOld.set("whiteCheck", Image.fromAsset("whiteCheckVanilla-old.png").image) +HypixelTicksOld.set("failedRoom", Image.fromAsset("failedRoomVanilla.png").image) +HypixelTicksOld.set("questionMark", Image.fromAsset("questionMarkVanilla-old.png").image) const HypixelTicksNew = new Map() -HypixelTicksNew.set("greenCheck", new Image("greenCheckVanilla-new.png", "https://i.imgur.com/KFGT3RL.png").image) -HypixelTicksNew.set("whiteCheck", new Image("whiteCheckVanilla-new.png", "https://i.imgur.com/pfDVZA0.png").image) -HypixelTicksNew.set("failedRoom", new Image("failedRoomVanilla.png", "https://i.imgur.com/WqW69z3.png").image) -HypixelTicksNew.set("questionMark", new Image("questionMarkVanilla-new.png", "https://i.imgur.com/xLI4gR6.png").image) +HypixelTicksNew.set("greenCheck", Image.fromAsset("greenCheckVanilla-new.png").image) +HypixelTicksNew.set("whiteCheck", Image.fromAsset("whiteCheckVanilla-new.png").image) +HypixelTicksNew.set("failedRoom", Image.fromAsset("failedRoomVanilla.png").image) +HypixelTicksNew.set("questionMark", Image.fromAsset("questionMarkVanilla-new.png").image) const NEUMapTicks = new Map() -NEUMapTicks.set("greenCheck", new Image("NEUMapGreenCheck.png", "https://i.imgur.com/vwiTAAf.png").image) //old: https://i.imgur.com/GQfTfmp.png -NEUMapTicks.set("whiteCheck", new Image("NEUMapWhiteCheck.png", "https://i.imgur.com/YOUsTg8.png").image) //old: https://i.imgur.com/9cZ28bJ.png -NEUMapTicks.set("failedRoom", new Image("NEUMapFailedRoom.png", "https://i.imgur.com/TM8LbGS.png").image) //old: https://i.imgur.com/YOUsTg8.png -NEUMapTicks.set("questionMark", new Image("NEUMapQuestionMark.png", "https://i.imgur.com/CPBuhXu.png").image) //old: https://i.imgur.com/kp92Inw.png +NEUMapTicks.set("greenCheck", Image.fromAsset("NEUMapGreenCheck.png").image) //old: https://i.imgur.com/GQfTfmp.png +NEUMapTicks.set("whiteCheck", Image.fromAsset("NEUMapWhiteCheck.png").image) //old: https://i.imgur.com/9cZ28bJ.png +NEUMapTicks.set("failedRoom", Image.fromAsset("NEUMapFailedRoom.png").image) //old: https://i.imgur.com/YOUsTg8.png +NEUMapTicks.set("questionMark", Image.fromAsset("NEUMapQuestionMark.png").image) //old: https://i.imgur.com/kp92Inw.png diff --git a/Render/ScoreRendering/ScoreMapRenderer.js b/Render/ScoreRendering/ScoreMapRenderer.js index ab028c0..05c41a9 100644 --- a/Render/ScoreRendering/ScoreMapRenderer.js +++ b/Render/ScoreRendering/ScoreMapRenderer.js @@ -1,4 +1,3 @@ -import { m } from "../../../mappings/mappings"; const { default: MapTab } = require("../MapTab"); @@ -18,7 +17,8 @@ class ScoreMapRenderer extends MapTab { let mapData // Get map data from hotbar try { let item = Player.getInventory().getStackInSlot(8) - mapData = item.getItem()[m.getMapData](item.getItemStack(), World.getWorld()); // ItemStack.getItem().getMapData() + // .getMapData + mapData = item.getItem().func_77873_a(item.getItemStack(), World.getWorld()); // ItemStack.getItem().getMapData() } catch (error) { } diff --git a/Utils/Position.js b/Utils/Position.js index e23f100..c9f4cea 100644 --- a/Utils/Position.js +++ b/Utils/Position.js @@ -46,6 +46,11 @@ class Position { get arrayY() { return Math.round((this.worldY + 200) / 32 * 2) / 2 } + + get arrayStr() { + return `${this.arrayX},${this.arrayY}` + } + set mapX(val) { if (!this.dungeonMap.dungeonTopLeft) return 0 this.worldX = MathLib.map(val, this.dungeonMap.dungeonTopLeft[0], this.dungeonMap.dungeonTopLeft[0] + this.dungeonMap.fullRoomScaleMap * 6, -200, -8) @@ -63,6 +68,19 @@ class Position { if (!this.dungeonMap.dungeonTopLeft) return 0 return MathLib.map(this.worldY, -200, -8, 0, 1) } + + get posIndex() { + // 200 + 0.5 to make transition between rooms smoother + // 32 is the size of each room including the door + const arrX = Math.floor((this.worldX + 200.5) / 32) + const arrY = Math.floor((this.worldY + 200.5) / 32) + + return arrX + arrY * 6 + } + + toString() { + return `Position[${this.arrayX}, ${this.arrayY}]` + } } export default Position \ No newline at end of file diff --git a/Utils/RoomComponent.js b/Utils/RoomComponent.js new file mode 100644 index 0000000..2785309 --- /dev/null +++ b/Utils/RoomComponent.js @@ -0,0 +1,29 @@ +import SoopyNumber from "../../guimanager/Classes/SoopyNumber" +import Position from "./Position" + +/** + * Extension of Position which only allows arrayX and arrayY to be integer values + */ +export default class RoomComponent extends Position { + constructor(worldX, worldY, dungeonMap) { + this.worldXRaw = new SoopyNumber(worldX) // Using the number wrapper so theres easy support for animations + this.worldYRaw = new SoopyNumber(worldY) // See usage in MapPlayer.js + + this.dungeonMap = dungeonMap + } + + static fromArrayPos(x, y) { + return new RoomComponent(-185 + x * 32, -185 + y * 32) + } + + get arrayX() { + return Math.floor((this.worldX + 185) / 32) + } + get arrayY() { + return Math.floor((this.worldY + 185) / 32) + } + + toString() { + return `(${this.arrayX},${this.arrayY})` + } +} \ No newline at end of file diff --git a/Utils/Utils.js b/Utils/Utils.js index 763b2ea..2bc51ed 100644 --- a/Utils/Utils.js +++ b/Utils/Utils.js @@ -1,13 +1,14 @@ -import { m } from "../../mappings/mappings" - /** * @param {Number} id id of the line that should be changed * @param {String} line text that the line should be changed to */ export function changeScoreboardLine(id, line) { - let scoreboard = World.getWorld()[m.getScoreboard.World](); - for (let team of scoreboard[m.getTeams]()) { - let name = team[m.getTeamName](); + // getScoreboard + let scoreboard = World.getWorld().func_96441_U(); + // .getTeams + for (let team of scoreboard.func_96525_g()) { + // .getTeamName + let name = team.func_96669_c(); if (name.includes('team') && name.includes(id)) { let prefix = line.substring(0, 15); let suffix = line.substring(15, 30); @@ -71,14 +72,28 @@ export function renderLore(x, y, lore) { } /** - * Maps a set of real coords (x and z) to 0-5, the same as the room components. - * @param {Number[]} realCoords - The real coords in the world ranging from -200 to -10. + * Maps a set of real coords (x and z) to 0-5. + * @param {Number} worldX + * @param {Number} worldY + * @returns + */ +export const getComponentFromPos = (worldX, worldZ) => { + return [ + Math.floor((worldX + 200.5) / 32), + Math.floor((worldZ + 200.5) / 32) + ] +} + +/** + * Maps component to real coord + * @param {Number} componentX - 0-5 + * @param {Number} componentZ - 0-5 * @returns */ -export const convertToRoomCoords = ([x, y]) => { +export const convertToRealCoords = (componentX, componentZ) => { return [ - MathLib.map(x, -200, -10, 0, 5), - MathLib.map(y, -200, -10, 0, 5) + -185 + 32 * x, + -185 + 32 * z, ] } @@ -365,4 +380,85 @@ export const isBetween = (number, min, max) => (number - min) * (number - max) < export function getPlayerName(player) { if (!player) return '???'; return ChatLib.removeFormatting(player.name ?? '???').replace(/[♲Ⓑ]/g, "").replace('§z', '').trim() +} + +/** + * Checks if the chunk at the specified coordinate is loaded. + * @param {Number} x + * @param {Number} y + * @param {Number} z + * @returns + */ +export const chunkLoaded = (x, y, z) => { + if (!World || !World.getWorld()) return false + return World.getChunk(x, y, z).chunk.func_177410_o() +} + +/** + * Gets the highest non-air block y value (And gold, for a room edge case) at this position, or null if there is only air + * @param {Number} x + * @param {Number} z + * @returns + */ +export const getHighestBlock = (x, z) => { + for (let y = 255; y > 0; y--) { + let id = World.getBlockAt(x, y, z)?.type?.getID() + // Ignore gold blocks too because of Gold room with a random ass gold block on the roof sometimes. + if (id == 0 || id == 41) continue + return y + } + return null +} + +const blacklisted = [ + 101, // Iron Bars + 54, // Chest +] +export const hashCode = s => s.split('').reduce((a,b)=>{a=((a<<5)-a)+b.charCodeAt(0);return a&a},0) // From https://stackoverflow.com/a/15710692/15767968 + +/** + * Gets the core hash at a certain x, z position + * @param {Number} x + * @param {Number} z + * @returns + */ +export const getCore = (x, z) => { + let blockIds = "" + for (let y = 140; y >= 12; y--) { + let block = World.getBlockAt(x, y, z) + // Blacklisted blocks should just be counted as air. + if (blacklisted.includes(block.type.getID())) { + blockIds += "0" + continue + } + + blockIds += block.type.getID() + } + + return hashCode(blockIds) +} + +export const Checkmark = { + NONE: 0, + GRAY: 1, + FAILED: 2, + WHITE: 3, + GREEN: 4 +} + +/** + * Rotates a set of coordinates clockwise. + * @param {[Number, Number, Number]} coordinates + * @param {Number} degree - Angle in indexes, eg 90 degrees = 1, 270 degrees = 3 + * @returns + */ +export const rotateCoords = ([x, y, z], degree) => { + if (degree < 0) degree = degree + 4 + + if (degree == 0) return [x, y, z] + if (degree == 1) return [z, y, -x] + if (degree == 2) return [-x, y, -z] + if (degree == 3) return [-z, y, x] + + return [x, y, z] } \ No newline at end of file diff --git a/Utils/renderUtils.js b/Utils/renderUtils.js index fe4bb05..0cfef1e 100644 --- a/Utils/renderUtils.js +++ b/Utils/renderUtils.js @@ -1,4 +1,3 @@ -import { f, m } from "../../mappings/mappings"; const { default: renderBeaconBeam2 } = require("../../BeaconBeam/index"); const { numberWithCommas } = require("./Utils"); @@ -180,7 +179,7 @@ let ret = { GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(false); - GlStateManager[m.pushMatrix]() + Tessellator.pushMatrix() Tessellator.begin(GL11.GL_LINE_STRIP).colorize(colorR, colorG, colorB, a); @@ -207,7 +206,7 @@ let ret = { Tessellator.draw(); - GlStateManager[m.popMatrix]() + Tessellator.popMatrix() GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(true); @@ -221,7 +220,7 @@ let ret = { GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(false); - GlStateManager[m.pushMatrix]() + Tessellator.pushMatrix() Tessellator.begin(GL11.GL_LINE_STRIP).colorize(colorR, colorG, colorB, a); @@ -251,7 +250,7 @@ let ret = { Tessellator.draw(); - GlStateManager[m.popMatrix]() + Tessellator.popMatrix() GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(true); @@ -381,7 +380,7 @@ let ret = { renderBeaconBeam2(x, y, z, r, g, b, alpha, !phase) }, drawCoolWaypoint(x, y, z, r, g, b, { name = "", showDist = !!name, phase = false }) { - let distToPlayerSq = (x - Player.getRenderX()) ** 2 + (y - (Player.getRenderY() + Player.getPlayer()[m.getEyeHeight]())) ** 2 + (z - Player.getRenderZ()) ** 2 + let distToPlayerSq = (x - Player.getRenderX()) ** 2 + (y - (Player.getRenderY() + Player.getPlayer().func_70047_e())) ** 2 + (z - Player.getRenderZ()) ** 2 let alpha = Math.min(1, Math.max(0, 1 - (distToPlayerSq - 10000) / 12500)) @@ -394,8 +393,8 @@ let ret = { let distRender = Math.min(distToPlayer, 50) - let loc5 = [Player.getRenderX() + (x + 0.5 - Player.getRenderX()) / (distToPlayer / distRender), (Player.getRenderY() + Player.getPlayer()[m.getEyeHeight]()) + (y + 2 + 20 * distToPlayer / 300 - (Player.getRenderY() + Player.getPlayer()[m.getEyeHeight]())) / (distToPlayer / distRender), Player.getRenderZ() + (z + 0.5 - Player.getRenderZ()) / (distToPlayer / distRender)] - let loc6 = [Player.getRenderX() + (x + 0.5 - Player.getRenderX()) / (distToPlayer / distRender), (Player.getRenderY() + Player.getPlayer()[m.getEyeHeight]()) + (y + 2 + 20 * distToPlayer / 300 - 10 * distToPlayer / 300 - (Player.getRenderY() + Player.getPlayer()[m.getEyeHeight]())) / (distToPlayer / distRender), Player.getRenderZ() + (z + 0.5 - Player.getRenderZ()) / (distToPlayer / distRender)] + let loc5 = [Player.getRenderX() + (x + 0.5 - Player.getRenderX()) / (distToPlayer / distRender), (Player.getRenderY() + Player.getPlayer().func_70047_e()) + (y + 2 + 20 * distToPlayer / 300 - (Player.getRenderY() + Player.getPlayer().func_70047_e())) / (distToPlayer / distRender), Player.getRenderZ() + (z + 0.5 - Player.getRenderZ()) / (distToPlayer / distRender)] + let loc6 = [Player.getRenderX() + (x + 0.5 - Player.getRenderX()) / (distToPlayer / distRender), (Player.getRenderY() + Player.getPlayer().func_70047_e()) + (y + 2 + 20 * distToPlayer / 300 - 10 * distToPlayer / 300 - (Player.getRenderY() + Player.getPlayer().func_70047_e())) / (distToPlayer / distRender), Player.getRenderZ() + (z + 0.5 - Player.getRenderZ()) / (distToPlayer / distRender)] if (name) Tessellator.drawString("§a" + name, loc5[0], loc5[1], loc5[2], 0, true, distRender / 300, false) if (showDist) Tessellator.drawString("§b(" + numberWithCommas(Math.round(distToPlayer)) + "m)", (name ? loc6[0] : loc5[0]), (name ? loc6[1] : loc5[1]), (name ? loc6[2] : loc5[2]), 0, false, distRender / 300, false) diff --git a/assets/NEUMapFailedRoom.png b/assets/NEUMapFailedRoom.png new file mode 100644 index 0000000..020d3bb Binary files /dev/null and b/assets/NEUMapFailedRoom.png differ diff --git a/assets/NEUMapGreenCheck.png b/assets/NEUMapGreenCheck.png new file mode 100644 index 0000000..aa55812 Binary files /dev/null and b/assets/NEUMapGreenCheck.png differ diff --git a/assets/NEUMapQuestionMark.png b/assets/NEUMapQuestionMark.png new file mode 100644 index 0000000..c1eb44e Binary files /dev/null and b/assets/NEUMapQuestionMark.png differ diff --git a/assets/NEUMapWhiteCheck.png b/assets/NEUMapWhiteCheck.png new file mode 100644 index 0000000..3bf11d7 Binary files /dev/null and b/assets/NEUMapWhiteCheck.png differ diff --git a/assets/f1_boss.png b/assets/f1_boss.png new file mode 100644 index 0000000..259c3fc Binary files /dev/null and b/assets/f1_boss.png differ diff --git a/assets/f2_boss.png b/assets/f2_boss.png new file mode 100644 index 0000000..7201ec2 Binary files /dev/null and b/assets/f2_boss.png differ diff --git a/assets/f3_boss.png b/assets/f3_boss.png new file mode 100644 index 0000000..2d840f5 Binary files /dev/null and b/assets/f3_boss.png differ diff --git a/assets/f4_boss.png b/assets/f4_boss.png new file mode 100644 index 0000000..fb77858 Binary files /dev/null and b/assets/f4_boss.png differ diff --git a/assets/f5_boss.png b/assets/f5_boss.png new file mode 100644 index 0000000..1d40e30 Binary files /dev/null and b/assets/f5_boss.png differ diff --git a/assets/f6_boss.png b/assets/f6_boss.png new file mode 100644 index 0000000..5356415 Binary files /dev/null and b/assets/f6_boss.png differ diff --git a/assets/f7_boss_end.png b/assets/f7_boss_end.png new file mode 100644 index 0000000..ccd250e Binary files /dev/null and b/assets/f7_boss_end.png differ diff --git a/assets/f7_boss_s1.png b/assets/f7_boss_s1.png new file mode 100644 index 0000000..76defd8 Binary files /dev/null and b/assets/f7_boss_s1.png differ diff --git a/assets/f7_boss_s2.png b/assets/f7_boss_s2.png new file mode 100644 index 0000000..af25210 Binary files /dev/null and b/assets/f7_boss_s2.png differ diff --git a/assets/f7_boss_s3.png b/assets/f7_boss_s3.png new file mode 100644 index 0000000..1cdef95 Binary files /dev/null and b/assets/f7_boss_s3.png differ diff --git a/assets/f7_boss_s4.png b/assets/f7_boss_s4.png new file mode 100644 index 0000000..7c3c8ab Binary files /dev/null and b/assets/f7_boss_s4.png differ diff --git a/assets/f7_boss_s5.png b/assets/f7_boss_s5.png new file mode 100644 index 0000000..f20c9b4 Binary files /dev/null and b/assets/f7_boss_s5.png differ diff --git a/assets/failedRoomVanilla.png b/assets/failedRoomVanilla.png new file mode 100644 index 0000000..c372588 Binary files /dev/null and b/assets/failedRoomVanilla.png differ diff --git a/assets/greenCheckVanilla-new.png b/assets/greenCheckVanilla-new.png new file mode 100644 index 0000000..418b62e Binary files /dev/null and b/assets/greenCheckVanilla-new.png differ diff --git a/assets/greenCheckVanilla-old.png b/assets/greenCheckVanilla-old.png new file mode 100644 index 0000000..7a50eda Binary files /dev/null and b/assets/greenCheckVanilla-old.png differ diff --git a/assets/markerOther.png b/assets/markerOther.png new file mode 100644 index 0000000..ae00f61 Binary files /dev/null and b/assets/markerOther.png differ diff --git a/assets/markerSelf.png b/assets/markerSelf.png new file mode 100644 index 0000000..3200239 Binary files /dev/null and b/assets/markerSelf.png differ diff --git a/assets/questionMarkVanilla-new.png b/assets/questionMarkVanilla-new.png new file mode 100644 index 0000000..f6da0d3 Binary files /dev/null and b/assets/questionMarkVanilla-new.png differ diff --git a/assets/questionMarkVanilla-old.png b/assets/questionMarkVanilla-old.png new file mode 100644 index 0000000..cda1412 Binary files /dev/null and b/assets/questionMarkVanilla-old.png differ diff --git a/assets/whiteCheckVanilla-new.png b/assets/whiteCheckVanilla-new.png new file mode 100644 index 0000000..5b14acb Binary files /dev/null and b/assets/whiteCheckVanilla-new.png differ diff --git a/assets/whiteCheckVanilla-old.png b/assets/whiteCheckVanilla-old.png new file mode 100644 index 0000000..2999981 Binary files /dev/null and b/assets/whiteCheckVanilla-old.png differ diff --git a/babel-substitute-mappings/babel-substitute-mappings.mjs b/babel-substitute-mappings/babel-substitute-mappings.mjs deleted file mode 100644 index 8bb5533..0000000 --- a/babel-substitute-mappings/babel-substitute-mappings.mjs +++ /dev/null @@ -1,178 +0,0 @@ -import fs from "fs" -let [m, f] = createMappings() - -export default function ({ types: t }) { - return { - visitor: { - Program(path, state) { - if (!isMappingsImported(path)) return - - replaceMappings(path, t, f, m) - } - } - }; -}; - -/** - * Also removes the import statement - */ -function isMappingsImported(mainPath) { - let isImported = false - - const MyVisitor = { - ImportDeclaration(path) { - let name = path.node.source.value - if (!name) return - - if (name.endsWith("mappings") || name.endsWith("mappings.js")) { - isImported = true - path.remove() - } - } - } - - mainPath.traverse(MyVisitor) - - return isImported -} - -function replaceMappings(mainPath, t, f, m) { - let isImported = false - - let data = { f, m } - - const MyVisitor = { - MemberExpression(path) { - if (path.node.object.object?.name === "f" || path.node.object.object?.name === "m") { - //3 part ed f.field.class - let what = path.node.object.object?.name - let method = path.node.object.property?.name - let clas = path.node.property?.name - if (!data[what][method][clas]) throw new Error("INVALID MAPPING (" + what + "." + method + "." + clas + ") D:") - path.replaceWith(t.stringLiteral(data[what][method][clas])) - } - if (path.node.object?.name === "f" || path.node.object?.name === "m") { - //3 part ed f.field.class - let what = path.node.object?.name - let method = path.node.property?.name - - if (!data[what][method]) throw new Error("INVALID MAPPING (" + what + "." + method + ") D:") - path.replaceWith(t.stringLiteral(data[what][method])) - } - } - } - - mainPath.traverse(MyVisitor) - - return isImported -} -import request from "sync-request" -function createMappings() { - let m = {} - let f = {} - let joinedFile = String(request('GET', 'http://soopy.dev/api/soopyv2/joined.tsrg').getBody()) - joinedFile = joinedFile.split("\n") - let joinedData = {} - let joinedData2 = {} - let currThing = [] - joinedFile.forEach(line => { - if (line.startsWith(" ")) { - line = line.split(" ") - let thingo = line.pop() - let thingo2 = line.pop() - joinedData[thingo] = currThing[1].split("/").pop() - if (thingo2.includes(")")) { - joinedData2[thingo] = thingo2.replace("(", "").replace(";", "").replace(")", "_") - } - } else { - currThing = line.split(" ") - } - }) - let methodsFile = String(request('GET', 'http://soopy.dev/api/soopyv2/methods.csv').getBody()) - let methodsArr = methodsFile.split("\n") - methodsArr.shift() - let methodsData = {} - methodsArr.forEach(method => { - let [searge, name, side, desc] = method.split(",") - - if (!methodsData[name]) methodsData[name] = {} - methodsData[name][joinedData[searge]] = { - searge: searge, - name: name, - side: side, - desc: desc - } - }) - let fieldsFile = String(request('GET', 'http://soopy.dev/api/soopyv2/fields.csv').getBody()) - let fieldsArr = fieldsFile.split("\n") - fieldsArr.shift() - let fieldsData = {} - fieldsArr.forEach(method => { - let [searge, name, side, desc] = method.split(",") - - if (!fieldsData[name]) fieldsData[name] = {} - fieldsData[name][joinedData[searge]] = { - searge: searge, - name: name, - side: side, - desc: desc - } - }) - let methodNameKeys = Object.keys(methodsData) - methodNameKeys.forEach((methodName, i) => { - let keys = Object.keys(methodsData[methodName]) - if (keys.length === 1) { - m[methodName] = methodsData[methodName][keys[0]].searge - } else { - m[methodName] = {} - let keysData = {} - keys.forEach(key => { - if (!keysData[key.split("_").pop()]) keysData[key.split("_").pop()] = [] - - keysData[key.split("_").pop()].push(methodsData[methodName][key]) - }) - keys.forEach(key => { - if (keysData[key.split("_").pop()].length === 0) return - if (keysData[key.split("_").pop()].length === 1) { - m[methodName][key.split("_").pop()] = methodsData[methodName][key].searge - } else { - m[methodName][key.split("_").pop()] = {} - keysData[key.split("_").pop()].forEach((method) => { - m[methodName][key.split("_").pop()][joinedData2[method.searge]] = method.searge - }) - - keysData[key.split("_").pop()] = [] - } - }) - } - }) - let fieldNameKeys = Object.keys(fieldsData) - fieldNameKeys.forEach((fieldName, i) => { - let keys = Object.keys(fieldsData[fieldName]) - if (keys.length === 1) { - f[fieldName] = fieldsData[fieldName][keys[0]].searge - } else { - f[fieldName] = {} - let keysData = {} - keys.forEach(key => { - if (!keysData[key.split("_").pop()]) keysData[key.split("_").pop()] = [] - - keysData[key.split("_").pop()].push(fieldsData[fieldName][key]) - }) - keys.forEach(key => { - if (keysData[key.split("_").pop()].length === 0) return - if (keysData[key.split("_").pop()].length === 1) { - f[fieldName][key.split("_").pop()] = fieldsData[fieldName][key].searge - } else { - f[fieldName][key.split("_").pop()] = {} - keysData[key.split("_").pop()].forEach((field) => { - f[fieldName][key.split("_").pop()][joinedData2[field.searge]] = field.searge - }) - - keysData[key.split("_").pop()] = [] - } - }) - } - }) - return [m, f] -} \ No newline at end of file diff --git a/build.bat b/build.bat deleted file mode 100644 index bb2a8d9..0000000 --- a/build.bat +++ /dev/null @@ -1 +0,0 @@ -npx babel --delete-dir-on-start --retain-lines . -d "out/BetterMap" --copy-files --no-copy-ignored --ignore "**/babal-substitute-mappings/**","**/.git/**","**/build.bat","**/init.bat","**/node_modules/**" \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..7496787 --- /dev/null +++ b/build.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +cd "$(dirname "$0")" + +rm -rf out/ + +mkdir out +mkdir out/BetterMap + +rsync -av --exclude-from=".gitignore"\ + --exclude="*.git*"\ + --exclude="build.sh"\ + --exclude="README.md"\ + * out/BetterMap/ + +cd out/ +zip -r BetterMap.zip BetterMap/ +rm -rf BetterMap \ No newline at end of file diff --git a/cleanBuild.bat b/cleanBuild.bat deleted file mode 100644 index a0bdc70..0000000 --- a/cleanBuild.bat +++ /dev/null @@ -1,10 +0,0 @@ -cd "out/BetterMap" -rd /s /q "babel-substitute-mappings" -rd /s /q ".git" -rd /s /q "node_modules" -del "build.bat" -del "cleanBuild.bat" -del "init.bat" -del "package.json" -del "package-lock.json" -cd "../../" \ No newline at end of file diff --git a/index.js b/index.js index 66df343..70f48a1 100644 --- a/index.js +++ b/index.js @@ -2,7 +2,6 @@ /// /// -import { m } from "../mappings/mappings" import DungeonMap from "./Components/DungeonMap" import MapRenderer from "./Render/MapRenderer" import RenderContextManager from "./Render/RenderContextManager" @@ -16,6 +15,7 @@ import { MESSAGE_PREFIX } from "./Utils/Utils" import { drawBoxAtBlock } from "./Utils/renderUtils" import settings from "./Extra/Settings/CurrentSettings" import socketConnection from "./socketConnection" +let MapData = Java.type("net.minecraft.world.storage.MapData") require("./Extra/Events/SecretTracker.js") /**@type {DungeonMap} */ @@ -47,37 +47,50 @@ register("step", () => { } } - if (currentDungeonMap) { - if (Player.getX() < 0 && Player.getZ() < 0) { // Ensuring they are not in boss room - let mapData - try { - let item = Player.getInventory().getStackInSlot(8) - mapData = item.getItem()[m.getMapData](item.getItemStack(), World.getWorld()) - } catch (error) { - } + if (!currentDungeonMap) return - if (mapData) { - currentDungeonMap.updateFromMap(mapData) + if (Player.getX() < 0 && Player.getZ() < 0) { // Ensuring they are not in boss room + + let mapData = null + + try { + let item = Player.getInventory().getStackInSlot(8) + // getMapData + mapData = item.getItem().func_77873_a(item.getItemStack(), World.getWorld()) + if (mapData && !currentDungeonMap.mapId) { + currentDungeonMap.mapId = item.getMetadata() } - if (!mapData || !currentDungeonMap.dungeonTopLeft) { - currentDungeonMap.updateFromWorld(); + } catch (error) { + if (currentDungeonMap.mapId) { + // loadItemData + mapData = World.getWorld().func_72943_a(MapData.class, "map_" + currentDungeonMap.mapId) } } - currentDungeonMap.updatePuzzles(); - currentDungeonMap.updateTabInfo(); + if (mapData) { + currentDungeonMap.updateFromMap(mapData) + } } + + currentDungeonMap.updatePuzzles(); + currentDungeonMap.updateTabInfo(); }).setFps(5) +register("packetReceived", (packet) => { + if (currentDungeonMap && !currentDungeonMap.mapId) { + // getMapId + currentDungeonMap.mapId = packet.func_149188_c() + } +}).setFilteredClass(net.minecraft.network.play.server.S34PacketMaps) + register("step", () => { if (!currentDungeonMap) return; currentDungeonMap.updatePlayers() - currentDungeonMap.identifyCurrentRoom(); }).setFps(1) + register("step", () => { - if (!currentDungeonMap) - return; + if (!currentDungeonMap) return; currentDungeonMap.syncPlayersThruSocket() }).setFps(3) @@ -204,8 +217,8 @@ register("renderWorld", () => { if (settings.settings.boxDoors && !currentDungeonMap.bloodOpen) { let isOpenable = currentDungeonMap.keys >= 1 currentDungeonMap.witherDoors.forEach(door => { - let x = door.position.worldX - door.position.worldX % 8 - 2 // Round to nearest door location, incase map is too low quality to get exact block - let y = door.position.worldY - door.position.worldY % 8 - 2 + let x = door.position.worldX - 1 // Round to nearest door location, incase map is too low quality to get exact block + let y = door.position.worldY - 1 drawBoxAtBlock(x, 69, y, isOpenable ? 0 : 1, isOpenable ? 1 : 0, 0, 3, 4) }) diff --git a/init.bat b/init.bat deleted file mode 100644 index 59a8e22..0000000 --- a/init.bat +++ /dev/null @@ -1 +0,0 @@ -npm i \ No newline at end of file diff --git a/metadata.json b/metadata.json index 6bfb93b..8c2c087 100644 --- a/metadata.json +++ b/metadata.json @@ -5,11 +5,11 @@ "entry": "index.js", "description": "Better Map !!!", "name": "BetterMap", - "version": "1.0.15", + "version": "1.2.1", "requires": [ "soopyApis", "guimanager", "soopyAddonsData", "BeaconBeam" ] -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index ffb392e..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2237 +0,0 @@ -{ - "name": "BetterMap", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "dependencies": { - "@babel/cli": "^7.0.0", - "@babel/core": "^7.0.0", - "child_process": "^1.0.2", - "sync-request": "^6.1.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/cli": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.19.3.tgz", - "integrity": "sha512-643/TybmaCAe101m2tSVHi9UKpETXP9c/Ff4mD2tAwkdP6esKIfaauZFc67vGEM6r9fekbEGid+sZhbEnSe3dg==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.8", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" - }, - "engines": { - "node": ">=6.9.0" - }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", - "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.2", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.1", - "@babel/parser": "^7.20.2", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", - "dependencies": { - "@babel/types": "^7.20.2", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "dependencies": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "optional": true - }, - "node_modules/@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "optional": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "optional": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/child_process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", - "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "optional": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "optional": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "optional": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "dependencies": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "dependencies": { - "@types/node": "^10.0.3" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "optional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "optional": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "optional": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "optional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "dependencies": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", - "dependencies": { - "get-port": "^3.1.0" - } - }, - "node_modules/then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", - "dependencies": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/then-request/node_modules/@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "optional": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/cli": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.19.3.tgz", - "integrity": "sha512-643/TybmaCAe101m2tSVHi9UKpETXP9c/Ff4mD2tAwkdP6esKIfaauZFc67vGEM6r9fekbEGid+sZhbEnSe3dg==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.8", - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==" - }, - "@babel/core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", - "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.2", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.1", - "@babel/parser": "^7.20.2", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", - "requires": { - "@babel/types": "^7.20.2", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" - }, - "@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==" - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "optional": true - }, - "@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "requires": { - "@types/node": "*" - } - }, - "@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "child_process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", - "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "optional": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "requires": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - } - }, - "http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "requires": { - "@types/node": "^10.0.3" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "optional": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "optional": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "optional": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "requires": { - "asap": "~2.0.6" - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "requires": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - } - }, - "sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", - "requires": { - "get-port": "^3.1.0" - } - }, - "then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", - "requires": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "dependencies": { - "@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" - } - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index c32d9e4..0000000 --- a/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "dependencies": { - "@babel/cli": "^7.0.0", - "@babel/core": "^7.0.0", - "child_process": "^1.0.2", - "sync-request": "^6.1.0" - } -} \ No newline at end of file