aboutsummaryrefslogtreecommitdiff
path: root/render/efficientMinerOverlay.js
diff options
context:
space:
mode:
authorNinjune x <enderknight537@gmail.com>2023-01-08 02:12:14 -0600
committerNinjune x <enderknight537@gmail.com>2023-01-08 02:12:14 -0600
commit688e13930681bca7881d19468745f7067e9bc5c2 (patch)
tree9e95e59359dd2ae6e2e7761666b99a191bb62a1f /render/efficientMinerOverlay.js
parent1891ada92ab1911cfaaa7ad0e72c85573f4fcbb6 (diff)
downloadcoleweight-future.tar.gz
coleweight-future.tar.bz2
coleweight-future.zip
v1.8.6future
Diffstat (limited to 'render/efficientMinerOverlay.js')
-rw-r--r--render/efficientMinerOverlay.js189
1 files changed, 189 insertions, 0 deletions
diff --git a/render/efficientMinerOverlay.js b/render/efficientMinerOverlay.js
new file mode 100644
index 0000000..cd6468d
--- /dev/null
+++ b/render/efficientMinerOverlay.js
@@ -0,0 +1,189 @@
+import { drawEspBox, trace } from "../util/renderUtil"
+import settings from "../settings"
+
+let blockStatesToFind = [
+ {name: "minecraft:wool[color=light_blue]", prio: 2},
+ {name: "minecraft:obsidian", prio: 0},
+ {name: "minecraft:prismarine[variant=prismarine_bricks]", prio: 0},
+ {name: "minecraft:prismarine[variant=prismarine_bricks]", prio: 0},
+ {name: "minecraft:prismarine[variant=prismarine]", prio: 0}]
+let threadActive = false,
+ maxPrio = -10000000,
+ drawBlocks = [],
+ lookingAt
+
+let thread = new Thread(() => {
+ threadActive = true
+ let tempPrio, tempMax = { prio: -100000 }, tempSecondMax = { prio: -100000 }, block, blockState, tempBlocks = []
+
+ const playerX = Player.getX(),
+ playerY = Player.getY(),
+ playerZ = Player.getZ(),
+ playerReach = 4
+
+ if(playerX == undefined || playerY == undefined || playerZ == undefined || !World.isLoaded()) { threadActive = false; return thread.stop() }
+
+
+ for(let x = Math.round(playerX-playerReach); x < Math.ceil(playerX+playerReach); x++)
+ {
+ for(let y = Math.round(playerY-playerReach); y < Math.ceil(playerY+playerReach); y++)
+ {
+ for(let z = Math.round(playerZ-playerReach); z < Math.ceil(playerZ+playerReach); z++)
+ {
+ block = World.getBlockAt(x, y, z)
+ blockState = block.getState().toString()
+
+ if(blockStatesToFind.some(obj => obj.name === blockState) && isVisible(x, y, z))
+ {
+ tempPrio = findPrio(x, y, z, blockState, blockStatesToFind[blockStatesToFind.findIndex(obj => obj.name === blockState)].prio)
+ tempBlocks.push({x: Math.round(x) + 0.5, y: y, z: Math.round(z) + 0.5, prio: tempPrio})
+ }
+ }
+ }
+ }
+ for(let i = 0; i < tempBlocks.length; i++)
+ {
+ if(tempBlocks[i].prio > tempMax.prio)
+ {
+ tempMax = tempBlocks[i]
+ }
+ if(tempBlocks[i].prio > tempSecondMax.prio && tempBlocks[i].prio < tempMax.prio)
+ {
+ tempSecondMax = tempBlocks[i]
+ }
+ }
+
+ if(tempMax == undefined || tempSecondMax == undefined) drawBlocks = []
+ else if(drawBlocks[0] != undefined && drawBlocks[1] != undefined && drawBlocks[0].x != undefined && drawBlocks[1].x != undefined &&
+ World.getBlockAt(drawBlocks[0].x, drawBlocks[0].y, drawBlocks[0].z).type.getRegistryName() === "minecraft:bedrock") // if player just mined block
+ {
+ drawBlocks[0] = drawBlocks[1]
+ threadActive = false
+ drawBlocks[1] = tempSecondMax
+ }
+ else
+ {
+ drawBlocks[0] = tempMax
+ drawBlocks[1] = tempSecondMax
+ maxPrio = tempMax.prio
+ }
+
+ threadActive = false
+})
+
+
+register("renderWorld", () => {
+ if(!settings.efficientMinerOverlay || drawBlocks.length < 2 || drawBlocks[0] == undefined || drawBlocks[1] == undefined
+ || drawBlocks[0].x == undefined || drawBlocks[1].x == undefined) return
+
+ try{
+ trace(drawBlocks[0].x, drawBlocks[0].y + 5/10, drawBlocks[0].z, 1, 0, 0.3, 0.7, true)
+ drawEspBox(drawBlocks[0].x, drawBlocks[0].y, drawBlocks[0].z, 1, 0, 0.3, 0.7, true)
+ drawEspBox(drawBlocks[1].x, drawBlocks[1].y, drawBlocks[1].z, 1, 0.5, 0.3, 0.7, true)
+ } catch(err) {if(settings.debug) console.log(err)}
+
+})
+
+/*register("step", () => { // debug, comment when done
+
+}).setFps(1)*/
+
+register("step", () => {
+ if(!threadActive)
+ thread.start()
+}).setFps(20)
+
+register("gameUnload", () => {
+ thread.stop()
+})
+
+
+function findPrio(originX, originY, originZ, blockStateToFind, prio)
+{
+ let radius = 2 + 1/2,
+ blockCount = 0,
+ rayTraceX, rayTraceY, rayTraceZ
+ if(Player.lookingAt() != undefined && Player.lookingAt()?.getRegistryName() != "minecraft:air")
+ lookingAt = Player.lookingAt()
+
+ if(lookingAt != undefined)
+ {
+ rayTraceX = lookingAt.getX()
+ rayTraceY = lookingAt.getY()
+ rayTraceZ = lookingAt.getZ()
+ }
+
+
+ for(let x = Math.round(originX-radius); x < Math.round(originX+radius); x++) // second cube
+ {
+ for(let y = Math.round(originY-radius); y < Math.round(originY+radius); y++)
+ {
+ for(let z = Math.round(originZ-radius); z < Math.round(originZ+radius); z++)
+ {
+ if(World.getBlockAt(x, y, z)?.getState()?.toString() === blockStateToFind)
+ {
+ if(checkConnectedBlocks(x, y, z, originX, originY, originZ, blockStateToFind, 2.5))
+ blockCount++
+ }
+ else if (World.getBlockAt(x, y, z)?.getState()?.toString() === "minecraft:stone[variant=smooth_diorite]")
+ {
+ if(prio > 0)
+ prio = 0
+ else
+ prio += 2/10
+ }
+
+ // RAYTRACE
+ if(lookingAt != undefined)
+ {
+ prio -= Math.abs(rayTraceX - x)/100 // = 0.01 per block of distance
+ prio -= Math.abs(rayTraceY - y)/100
+ prio -= Math.abs(rayTraceZ - z)/100
+ }
+
+ }
+ }
+ }
+ if(blockCount > 6)
+ blockCount = 6
+ prio += blockCount*3/10
+
+ return Math.round(prio*100)/100
+}
+
+function isVisible(x, y, z)
+{
+ if(World.getBlockAt(x, y, z).type.getRegistryName() === "minecraft:bedrock") return false
+ if (World.getBlockAt(x, y+1, z).type.getRegistryName() === "minecraft:air") return true // above
+ if (World.getBlockAt(x, y-1, z).type.getRegistryName() === "minecraft:air") return true // below
+ if (World.getBlockAt(x+1, y, z).type.getRegistryName() === "minecraft:air") return true // east
+ if (World.getBlockAt(x-1, y, z).type.getRegistryName() === "minecraft:air") return true // west
+ if (World.getBlockAt(x, y, z+1).type.getRegistryName() === "minecraft:air") return true // north
+ if (World.getBlockAt(x, y, z-1).type.getRegistryName() === "minecraft:air") return true // south
+
+ return false
+}
+
+
+function checkConnectedBlocks(x, y, z, originX, originY, originZ, blockStateToFind, distance) {
+ if (World.getBlockAt(x, y, z).getState().toString() !== blockStateToFind) {
+ return false;
+ }
+ if (Math.abs(x - originX) + Math.abs(y - originY) + Math.abs(z - originZ) > distance) {
+ return false;
+ }
+
+ for (let dx = -1; dx <= 1; dx++) {
+ for (let dy = -1; dy <= 1; dy++) {
+ for (let dz = -1; dz <= 1; dz++) {
+ if (dx === 0 && dy === 0 && dz === 0) {
+ continue;
+ }
+ if (!checkConnectedBlocks(x + dx, y + dy, z + dz, distance)) {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+} \ No newline at end of file