diff options
Diffstat (limited to 'src/features/dungeonMap2/index.js')
-rw-r--r-- | src/features/dungeonMap2/index.js | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/src/features/dungeonMap2/index.js b/src/features/dungeonMap2/index.js new file mode 100644 index 0000000..199bc05 --- /dev/null +++ b/src/features/dungeonMap2/index.js @@ -0,0 +1,312 @@ +/// <reference types="../../../../CTAutocomplete" /> +/// <reference lib="es2015" /> + +import Feature from "../../featureClass/class"; +import renderLibs from "../../../guimanager/renderLibs"; +import DungeonMapData from "./DungeonMapData"; +import DungeonRoomStaticData from "./DungeonRoomStaticData"; +import ImageLocationSetting from "../settings/settingThings/imageLocation"; +import ToggleSetting from "../settings/settingThings/toggle"; +import { f, m } from "../../../mappings/mappings"; + +const DefaultVertexFormats = Java.type("net.minecraft.client.renderer.vertex.DefaultVertexFormats") +const MCTessellator = Java.type("net.minecraft.client.renderer.Tessellator") + +class DungeonMap extends Feature { + constructor() { + super() + } + + onEnable() { + if (Player.getUUID().toString() !== "dc8c3964-7b29-4e03-ae9e-d13ebd65dd29") { + new SettingBase("not Coming soontm", "maby", undefined, "coming_soontm", this) + return + } + this.mapLocation = new ImageLocationSetting("Map Location", "Sets the location of the map on the hud", "dmap_location", this, [10, 10, 1], new Image(javax.imageio.ImageIO.read(new java.io.File("./config/ChatTriggers/modules/SoopyV2/features/dungeonMap/map.png"))), 150, 150) + this.mapSecrets = new ToggleSetting("Show secret count instead of tick", "Syncs between soopyv2 users", true, "dmap_secrets", this) + + this.lastRoomId = undefined + + /**@type {DungeonMapData} */ + this.currentDungeon = undefined + this.lastChange = 0 + + this.roomXY = this.getRoomXYWorld().join(",") + this.lastXY = undefined + + let registerActionBar = this.registerCustom("actionbar", (curr, max) => { + + let roomid = this.getCurrentRoomId() + let roomWorldData = this.getRoomWorldData() + + let rotation = roomWorldData.width > roomWorldData.height ? 0 : 1 + + if (this.getCurrentRoomData().shape === "L") rotation = roomWorldData.rotation + if (this.getCurrentRoomData().type === "spawn") { + roomWorldData.x = x + 1 + roomWorldData.y = y + 1 + } + + this.currentDungeon.roomSecrets(roomWorldData.x, roomWorldData.y, rotation, roomid, curr, max) + }) + registerActionBar.trigger.setCriteria('&7${curr}/${max} Secrets').setParameter('contains'); + + this.registerStep(true, 5, this.update) + + this.registerEvent("renderOverlay", this.renderOverlay) + this.registerEvent("worldLoad", this.worldLoad) + + } + + update() { + if (!this.isInDungeon()) { + if (this.currentDungeon) { + this.currentDungeon.destroy() + this.lastRoomId = undefined + this.currentDungeon = undefined + } + return + } + + if (!this.currentDungeon) { + this.currentDungeon = new DungeonMapData(this.FeatureManager.features["dataLoader"].class.dungeonFloor) + } + this.currentDungeon.setRenderTicks(!this.mapSecrets.getValue()) + + this.currentDungeon.updatePlayers() + this.currentDungeon.updateHotbarData() + + let roomid = this.getCurrentRoomId() + if (!roomid.includes(",")) return + if (this.roomXY !== this.getRoomXYWorld().join(",")) { + this.roomXY = this.getRoomXYWorld().join(",") + this.lastChange = Date.now() + } + + let x = Math.floor((Player.getX() + 8) / 32) * 32 - 9 + let y = Math.floor((Player.getZ() + 8) / 32) * 32 - 9 + + if (roomid !== this.lastRoomId && Date.now() - this.lastChange > 500) { + this.lastRoomId = roomid + + let roomWorldData = this.getRoomWorldData() + + let rotation = roomWorldData.width > roomWorldData.height ? 0 : 1 + + if (this.getCurrentRoomData().shape === "L") rotation = roomWorldData.rotation + if (this.getCurrentRoomData().type === "spawn") { + roomWorldData.x = x + 1 + roomWorldData.y = y + 1 + } + + this.currentDungeon.setRoom(roomWorldData.x, roomWorldData.y, rotation, roomid) + } + + + if (this.lastXY !== x + "," + y) { + this.lastXY = x + "," + y + if (this.getBlockAt(x + 16, 73, y) !== 0) { + this.currentDungeon.setDoor(x + 16, y, -1, 0) + } + if (this.getBlockAt(x, 73, y + 16) !== 0) { + this.currentDungeon.setDoor(x, y + 16, -1, 1) + } + if (this.getBlockAt(x + 16, 73, y + 32) !== 0) { + this.currentDungeon.setDoor(x + 16, y + 32, -1, 0) + } + if (this.getBlockAt(x + 32, 73, y + 16) !== 0) { + this.currentDungeon.setDoor(x + 32, y + 16, -1, 1) + } + } + } + + renderOverlay() { + if (this.currentDungeon) { + this.currentDungeon.updatePlayersFast() + + let x = this.mapLocation.getValue()[0] + let y = this.mapLocation.getValue()[1] + let size = 150 * this.mapLocation.getValue()[2] + Renderer.drawRect(Renderer.color(0, 0, 0, 100), x, y, size, size) + + this.currentDungeon.getImage().draw(x, y, size, size) + + Renderer.drawRect(Renderer.color(0, 0, 0), x, y, size, 2) + Renderer.drawRect(Renderer.color(0, 0, 0), x, y, 2, size) + Renderer.drawRect(Renderer.color(0, 0, 0), x + size - 2, y, 2, size) + Renderer.drawRect(Renderer.color(0, 0, 0), x, y + size - 2, size, 2) + + for (let player of this.currentDungeon.getPlayers()) { + let x2 = this.currentDungeon.toImageX(player.x) * size + x + let y2 = this.currentDungeon.toImageY(player.y) * size + y + let rx = -6 + let ry = -6 + let rw = 12 + let rh = 12 + + Renderer.translate(x2, y2) + Renderer.rotate(player.rotate) + GlStateManager[m.enableBlend]() + GlStateManager[m.scale](1, 1, 50) + Client.getMinecraft()[m.getTextureManager]()[m.bindTexture.TextureManager](player.skin) + 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](rx, ry + rh, 0.0)[m.tex](8 / 64, 16 / 64)[m.endVertex]() + worldRenderer[m.pos](rx + rw, ry + rh, 0.0)[m.tex](16 / 64, 16 / 64)[m.endVertex]() + worldRenderer[m.pos](rx + rw, ry, 0.0)[m.tex](16 / 64, 8 / 64)[m.endVertex]() + worldRenderer[m.pos](rx, ry, 0.0)[m.tex](8 / 64, 8 / 64)[m.endVertex]() + tessellator[m.draw.Tessellator]() + + Tessellator.popMatrix() + Tessellator.pushMatrix() + } + + if (this.mapSecrets.getValue()) { + Renderer.retainTransforms(true) + Renderer.translate(x, y) + this.currentDungeon.renderSecrets(size) + Renderer.translate(-x, -y) + Renderer.retainTransforms(false) + } + } + } + + worldLoad() { + if (this.currentDungeon) this.currentDungeon.destroy() + this.lastRoomId = undefined + this.currentDungeon = undefined + } + + getCurrentRoomId() { + if (Scoreboard.getLines().length === 0) return undefined + let id = Scoreboard.getLineByIndex(Scoreboard.getLines().length - 1).getName().trim().split(" ").pop() + + return id + } + + isInDungeon() { + if (!this.FeatureManager || !this.FeatureManager.features["dataLoader"]) return false + return this.FeatureManager.features["dataLoader"].class.isInDungeon + } + + getRoomXYWorld() { + let roomData = this.getRoomWorldData() + if (roomData.rotation === 4) { + return [roomData.x, roomData.y + 32] + } + + return [roomData.x, roomData.y] + } + + getCurrentRoomData() { + return DungeonRoomStaticData.getDataFromId(this.getCurrentRoomId()) + } + + 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 + } + + return -1 + } + + 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 (World.getBlockStateAt(new BlockPos(x - 1, roofY, y)).getBlockId() !== 0) { + x -= 32 + width += 32 + } + while (World.getBlockStateAt(new BlockPos(x, roofY, y - 1)).getBlockId() !== 0) { + y -= 32 + height += 32 + } + while (World.getBlockStateAt(new BlockPos(x - 1, roofY, y)).getBlockId() !== 0) { //second iteration incase of L shape + x -= 32 + width += 32 + } + while (World.getBlockStateAt(new BlockPos(x + width + 1, roofY, y)).getBlockId() !== 0) { + width += 32 + } + while (World.getBlockStateAt(new BlockPos(x, roofY, y + height + 1)).getBlockId() !== 0) { + height += 32 + } + while (World.getBlockStateAt(new BlockPos(x + width, roofY, y + height + 1)).getBlockId() !== 0) { //second iteration incase of L shape + height += 32 + } + while (World.getBlockStateAt(new BlockPos(x + width + 1, roofY, y + height)).getBlockId() !== 0) { //second iteration incase of L shape + width += 32 + } + while (World.getBlockStateAt(new BlockPos(x + width, roofY, y - 1)).getBlockId() !== 0) {//second iteration incase of L shape + y -= 32 + height += 32 + } + while (World.getBlockStateAt(new BlockPos(x - 1, roofY, y + height)).getBlockId() !== 0) { //third iteration incase of L shape + x -= 32 + width += 32 + } + + + return { + x, + y, + width, + height, + cx: x + width / 2, + cy: y + height / 2, + rotation: this.getRotation(x, y, width, height, roofY) + } + } + + getRoofAt(x, z) { + let y = 255 + while (y > 0 && World.getBlockStateAt(new BlockPos(x, y, z)).getBlockId() === 0) y-- + + return y + } + + getTopBlockAt(x, z, y) { + if (!y) y = this.getHeightAt(x, z) + + return World.getBlockStateAt(new BlockPos(x, y, z)).getMetadata() + } + getBlockAt(x, y, z) { + return World.getBlockStateAt(new BlockPos(x, y, z)).getBlockId() + } + getTopBlockAt2(x, z, y) { + if (!y) y = this.getHeightAt(x, z) + + return World.getBlockStateAt(new BlockPos(x, y, z)).getBlockId() + } + onDisable() { + } +} + +module.exports = { + class: new DungeonMap() +}
\ No newline at end of file |