///
///
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() {
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()
}