diff options
Diffstat (limited to 'src/features/waypoints')
-rw-r--r-- | src/features/waypoints/index.js | 323 | ||||
-rw-r--r-- | src/features/waypoints/metadata.json | 8 | ||||
-rw-r--r-- | src/features/waypoints/minewaypoints_socket.js | 49 | ||||
-rw-r--r-- | src/features/waypoints/pathfind.js | 96 |
4 files changed, 476 insertions, 0 deletions
diff --git a/src/features/waypoints/index.js b/src/features/waypoints/index.js new file mode 100644 index 0000000..66bf0f5 --- /dev/null +++ b/src/features/waypoints/index.js @@ -0,0 +1,323 @@ +/// <reference types="../../../../CTAutocomplete" /> +/// <reference lib="es2015" /> +import { m } from "../../../mappings/mappings"; +import Feature from "../../featureClass/class"; +import { Waypoint } from "../../utils/renderJavaUtils"; +import { drawCoolWaypoint } from "../../utils/renderUtils"; +import { calculateDistanceQuick } from "../../utils/utils"; +import SettingBase from "../settings/settingThings/settingBase"; +import ToggleSetting from "../settings/settingThings/toggle"; +import minewaypoints_socket from "./minewaypoints_socket"; + + +let areas = { + "MinesofDivan": "Mines of Divan", + "LostPrecursorCity": "Lost Precursor City", + "JungleTemple": "Jungle Temple", + "GoblinQueensDen": "Goblin Queen's Den", + "Khazaddm": "Khazad-dûm", + "KingYolkar": "§6King Yolkar", + "BossCorleone": "§cBoss Corleone" +} + +class Waypoints extends Feature { + constructor() { + super() + } + + onEnable() { + this.initVariables() + + new SettingBase("/addwaypoint [name] [x] [y] [z] [r?] [g?] [b?] [area?]", "Allows you to create a waypoint", undefined, "create_waypoint", this) + new SettingBase("/delwaypoint [name]", "Allows you to delete a waypoint", undefined, "delete_waypoint", this) + new SettingBase("/clearwaypoints", "Allows you to clear all the waypoints", undefined, "clear_waypoints", this) + new SettingBase("/savewaypoints", "Copys the waypoints to your clipboard", undefined, "save_waypoints", this) + new SettingBase("/loadwaypoints", "Loads waypoints from your clipboard", undefined, "load_waypoints", this) + this.showInfoInChat = new ToggleSetting("Show info in chat", "Should chat msg be sent when theres waypoint added/cleared/removed", true, "waypoints_send_message", this); + + this.loadWaypointsFromSendCoords = new ToggleSetting("Load waypoints from /patcher sendcoords messages", "Will dissapear after 1min", true, "load_waypoints_from_sendcoords", this) + this.mineWaypointsSetting = new ToggleSetting("CH waypoints", "Will sync between users", true, "minwaypoints", this) + + try { + this.userWaypoints = JSON.parse(FileLib.read("soopyAddonsData", "soopyv2userwaypoints.json") || "{}") + } catch (e) { + ChatLib.chat(this.messagePrefix + "&cYour waypoints file corrupted and could not be read! Resetting to defaults.") + this.userWaypoints = {} + } + this.userWaypointsHash = {} + this.userWaypointsAll = [] + this.lastArea = undefined + this.userWaypointsArr = Object.values(this.userWaypoints) + this.updateWaypointsHashes() + this.waypointsChanged = false + + this.patcherWaypoints = [] + + this.registerCommand("addwaypoint", (name, x = Math.floor(Player.getX()).toString(), y = Math.floor(Player.getY()).toString(), z = Math.floor(Player.getZ()).toString(), r = "0", g = "255", b = "0", area = "") => { + let lx = 0 + let ly = 0 + let lz = 0 + + if (Player.lookingAt().getX) { + lx = Player.lookingAt().getX() + ly = Player.lookingAt().getY() + lz = Player.lookingAt().getZ() + + if (Player.lookingAt().getWidth) { + lx += -0.5 + lz += -0.5 + } + } + + this.userWaypoints[name] = { + x: parseFloat(x.replace("l", lx).replace('p', Math.floor(Player.getX()))), + y: parseFloat(y.replace("l", ly).replace('p', Math.floor(Player.getY()))), + z: parseFloat(z.replace("l", lz).replace('p', Math.floor(Player.getZ()))), + r: parseInt(r) / 255, + g: parseInt(g) / 255, + b: parseInt(b) / 255, + area: area === "a" ? this.FeatureManager.features["dataLoader"].class.area : area.replace(/_/g, " "), + options: { name: ChatLib.addColor(name.replace(/_/g, " ")) } + } + + this.userWaypointsArr = Object.values(this.userWaypoints) + this.waypointsChanged = true + this.updateWaypointsHashes() + if (this.showInfoInChat.getValue()) ChatLib.chat(this.FeatureManager.messagePrefix + "Added waypoint " + name + "!") + }) + + this.registerCommand("delwaypoint", (name) => { + delete this.userWaypoints[name] + this.userWaypointsArr = Object.values(this.userWaypoints) + this.waypointsChanged = true + this.updateWaypointsHashes() + if (this.showInfoInChat.getValue()) ChatLib.chat(this.FeatureManager.messagePrefix + "Deleted waypoint " + name + "!") + }) + this.registerCommand("clearwaypoints", () => { + this.userWaypointsAll.forEach(w => w.stopRender()) + Object.values(this.userWaypointsHash).forEach(a => a.forEach(w => w.stopRender())) + this.userWaypoints = {} + this.userWaypointsArr = [] + this.waypointsChanged = true + this.updateWaypointsHashes() + if (this.showInfoInChat.getValue()) ChatLib.chat(this.FeatureManager.messagePrefix + "Cleared waypoints!") + }) + this.registerCommand("savewaypoints", () => { + Java.type("net.minecraft.client.gui.GuiScreen")[m.setClipboardString](JSON.stringify(this.userWaypoints)) + ChatLib.chat(this.FeatureManager.messagePrefix + "Saved waypoints to clipboard!") + }) + this.registerCommand("loadwaypoints", () => { + try { + this.userWaypoints = JSON.parse(Java.type("net.minecraft.client.gui.GuiScreen")[m.getClipboardString]()) + + this.userWaypointsArr = Object.values(this.userWaypoints) + this.waypointsChanged = true + this.updateWaypointsHashes() + if (this.showInfoInChat.getValue()) ChatLib.chat(this.FeatureManager.messagePrefix + "Loaded waypoints from clipboard!") + } catch (e) { + if (this.showInfoInChat.getValue()) ChatLib.chat(this.FeatureManager.messagePrefix + "Error loading from clipboard!") + console.log(JSON.stringify(e, undefined, 2)) + console.log(e.stack) + } + }) + + this.ignorePlayers = new Set() + + this.registerCommand("waypointignoreadd", (player) => { + this.ignorePlayers.add(player) + ChatLib.chat(this.FeatureManager.messagePrefix + "Added " + player + " to waypoint ignore list, this will be cleared next game start!") + + this.patcherWaypoints = this.patcherWaypoints.filter(w => { + if (ChatLib.removeFormatting(w[1].params.name).trim().split(" ").pop() === player) { + w[1].stopRender() + return false + } + + return true + }) + }) + + this.registerChat("&r${*} &8> ${player}&f: &rx: ${x}, y: ${y}, z: ${z}", (player, x, y, z, e) => { + let p = ChatLib.removeFormatting(player).trim().split(" ").pop() + if (this.loadWaypointsFromSendCoords.getValue() && !this.ignorePlayers.has(p)) { + new TextComponent(this.FeatureManager.messagePrefix + "Loaded waypoint from &6" + p + "&7, &cCLICK HERE &7to ignore waypoints from them.").setClick("run_command", "/waypointignoreadd " + p).chat() + this.patcherWaypoints.push([Date.now(), new Waypoint(parseInt(x), parseInt(y), parseInt(ChatLib.removeFormatting(z)), 0, 0, 1, { name: ChatLib.addColor(player), showDist: true }).startRender()]) + if (this.patcherWaypoints.length > 10) this.patcherWaypoints.shift()[1].stopRender() + } + }) + this.registerChat("${player}&r&f: x: ${x}, y: ${y}, z: ${z}", (player, x, y, z, e) => { + if (player.includes(">")) return + let p = ChatLib.removeFormatting(player).trim().split(" ").pop() + if (this.loadWaypointsFromSendCoords.getValue() && !this.ignorePlayers.has(p)) {//parseInt(x), parseInt(y), parseInt(ChatLib.removeFormatting(z)), ChatLib.addColor(player) + new TextComponent(this.FeatureManager.messagePrefix + "Loaded waypoint from &6" + p + "&7, &cCLICK HERE &7to ignore waypoints from them.").setClick("run_command", "/waypointignoreadd " + p).chat() + this.patcherWaypoints.push([Date.now(), new Waypoint(parseInt(x), parseInt(y), parseInt(ChatLib.removeFormatting(z)), 0, 0, 1, { name: ChatLib.addColor(player), showDist: true }).startRender()]) + if (this.patcherWaypoints.length > 10) this.patcherWaypoints.shift()[1].stopRender() + } + }) + + this.registerStep(false, 5, () => { + while (this.patcherWaypoints[0]?.[0] < Date.now() - 60000) { + this.patcherWaypoints.shift()[1].stopRender() + } + }) + + let lastX = 0 + let lastY = 0 + let lastZ = 0 + let lastTick = 0 + this.registerEvent("renderWorld", () => { + if (Math.round(Player.getX()) !== lastX + || Math.round(Player.getY()) !== lastY + || Math.round(Player.getZ()) !== lastZ + || Date.now() - lastTick > 500) { + lastX = Math.round(Player.getX()) + lastY = Math.round(Player.getY()) + lastZ = Math.round(Player.getZ()) + lastTick = Date.now() + + this.tickWaypoints() + } + }) + + + this.lastSend = 0 + this.locations = {} + minewaypoints_socket.setLocationHandler = (area, loc) => { + this.locations[area || loc[0].area] = loc; + } + let lastLoc = [0, 0, 0] + this.lastTp = 0 + this.registerEvent("tick", () => { + try { + if (Scoreboard.getLines().length < 2) return; + let server = ChatLib.removeFormatting(Scoreboard.getLineByIndex(Scoreboard.getLines().length - 1)).split(" ") + + if (server.length === 2) { + server = server[1].replace(/[^0-9A-z]/g, "") + } else { + return; + } + + minewaypoints_socket.setServer(server, World.getWorld().func_82737_E()) + + let loc = [Player.getX(), Player.getY(), Player.getZ()] + if (calculateDistanceQuick(lastLoc, loc) > 20 ** 2) { + this.lastTp = Date.now() + } + lastLoc = loc + + if (Date.now() - this.lastSend > 1000 && Date.now() - this.lastTp > 5000) { + Scoreboard.getLines().forEach(line => { + line = ChatLib.removeFormatting(line.getName()).replace(/[^0-9A-z]/g, "") + if (Object.keys(areas).includes(line)) { + minewaypoints_socket.setLocation(line, { x: Math.floor(Player.getX()), y: Math.floor(Player.getY()), z: Math.floor(Player.getZ()) }) + } + }) + this.lastSend = Date.now() + } + } catch (e) { + console.log("SOOPYV2MINEWAYPOINTS ERROR") + console.log(JSON.stringify(e, undefined, 2)) + } + }) + + this.registerStep(false, 5, () => { + + World.getAllEntities().forEach(e => { + if (Math.max(Math.abs(Player.getX() - e.getX()), Math.abs(Player.getY() - e.getY()), Math.abs(Player.getZ() - e.getZ())) > 20) return; + + if (!this.locations["KingYolkar"]) { + if (ChatLib.removeFormatting(e.getName()) === "King Yolkar") { + minewaypoints_socket.setLocation("KingYolkar", { x: e.getX(), y: e.getY() + 3.5, z: e.getZ() }) + } + } + if (ChatLib.removeFormatting(e.getName()).includes("Boss Corleone")) { + minewaypoints_socket.setLocation("BossCorleone", { x: e.getX(), y: e.getY() + 3.5, z: e.getZ() }) + } + }) + // console.log(JSON.stringify(locations, undefined, 2)) + }) + + this.registerEvent("renderWorld", () => { + if (!this.mineWaypointsSetting.getValue()) return + if (this.FeatureManager.features["dataLoader"].class.area !== "Crystal Hollows") return + Object.values(this.locations).forEach(item => { + if (!item) return; + item.forEach(loc => { + // console.log(JSON.stringify(loc, undefined, 2)) + if (loc.loc.x) { + drawCoolWaypoint(loc.loc.x, loc.loc.y, loc.loc.z, 0, 255, 0, { name: areas[loc.area] }) + } else { + drawCoolWaypoint(loc.loc.minX / 2 + loc.loc.maxX / 2, loc.loc.minY / 2 + loc.loc.maxY / 2, loc.loc.minZ / 2 + loc.loc.maxZ / 2, 0, 255, 0, { name: areas[loc.area] }) + } + }) + }) + }).registeredWhen(() => this.mineWaypointsSetting.getValue()) + + this.registerEvent("worldLoad", () => { + this.locations = {} + }) + } + + tickWaypoints() { + for (let waypoint of this.userWaypointsAll) { + waypoint.update() + } + for (let waypoint of this.patcherWaypoints) { + waypoint[1].update() + } + let area = this.FeatureManager.features["dataLoader"] ? this.FeatureManager.features["dataLoader"].class.area : "NONE" + if (this.lastArea && this.lastArea !== area) { + if (this.userWaypointsHash[this.lastArea]) { + for (let waypoint of this.userWaypointsHash[lastArea]) { + waypoint.stopRender() + } + + } + } + this.lastArea = area + + if (this.userWaypointsHash[area]) { + for (let waypoint of this.userWaypointsHash[area]) { + waypoint.update() + waypoint.startRender() + } + } + } + + updateWaypointsHashes() { + this.userWaypointsAll.forEach(w => w.stopRender()) + Object.values(this.userWaypointsHash).forEach(a => a.forEach(w => w.stopRender())) + + this.userWaypointsAll = [] + this.userWaypointsHash = {} + for (let waypoint of this.userWaypointsArr) { + if (!waypoint.area) { + this.userWaypointsAll.push(new Waypoint(waypoint.x, waypoint.y, waypoint.z, waypoint.r, waypoint.g, waypoint.b, waypoint.options).startRender()) + } else { + if (!this.userWaypointsHash[waypoint.area]) this.userWaypointsHash[waypoint.area] = [] + this.userWaypointsHash[waypoint.area].push(new Waypoint(waypoint.x, waypoint.y, waypoint.z, waypoint.r, waypoint.g, waypoint.b, waypoint.options)) + } + } + } + + initVariables() { + + } + + onDisable() { + this.userWaypointsAll.forEach(w => w.stopRender()) + Object.values(this.userWaypointsHash).forEach(a => a.forEach(w => w.stopRender())) + this.patcherWaypoints.forEach(p => p[1].stopRender()) + + if (this.waypointsChanged) { + FileLib.write("soopyAddonsData", "soopyv2userwaypoints.json", JSON.stringify(this.userWaypoints)) + } + + this.initVariables() + } +} + +module.exports = { + class: new Waypoints() +} diff --git a/src/features/waypoints/metadata.json b/src/features/waypoints/metadata.json new file mode 100644 index 0000000..c162b72 --- /dev/null +++ b/src/features/waypoints/metadata.json @@ -0,0 +1,8 @@ +{ + "name": "Waypoints", + "description": "Allows rendering + creation of custom waypoints", + "isHidden": false, + "isTogglable": true, + "defaultEnabled": true, + "sortA": 0 +}
\ No newline at end of file diff --git a/src/features/waypoints/minewaypoints_socket.js b/src/features/waypoints/minewaypoints_socket.js new file mode 100644 index 0000000..0cc31e5 --- /dev/null +++ b/src/features/waypoints/minewaypoints_socket.js @@ -0,0 +1,49 @@ +import socketData from "../../../soopyApis/socketData"; +import WebsiteCommunicator from "../../../soopyApis/websiteCommunicator"; + +class MineWayPointsServer extends WebsiteCommunicator { + constructor() { + super(socketData.serverNameToId.minewaypoints); + + this.setLocationHandler = undefined + this.hypixelServer = undefined + this.lastSend = Date.now() + } + + onConnect() { + this.hypixelServer = undefined + } + + onData(data) { + switch (data.type) { + case "setLocation": + if (this.setLocationHandler) { + this.setLocationHandler(data.area, data.location); + } + break; + } + } + + setLocation(area, loc) { + this.sendData({ + type: "setLocation", + area: area, + location: loc + }); + } + + setServer(server, worldTime) { + if (this.hypixelServer === server && Date.now() - this.lastSend < 10000) return; + + this.lastSend = Date.now() + this.hypixelServer = server + this.sendData({ + type: "setServer", + server: server, + time: worldTime + }); + } +} + +global.soopyV2mineWayPointsServer = new MineWayPointsServer() +export default global.soopyV2mineWayPointsServer;
\ No newline at end of file diff --git a/src/features/waypoints/pathfind.js b/src/features/waypoints/pathfind.js new file mode 100644 index 0000000..42135d8 --- /dev/null +++ b/src/features/waypoints/pathfind.js @@ -0,0 +1,96 @@ +import FlatQueue from "../../datastructures/flatqueue" + +const directions = [ + [1,0,0,1], + [0,1,0,1], + [0,0,1,1], + [-1,0,0,1], + [0,-1,0,1], + [0,0,-1,1], + [1,1,0,Math.SQRT2], + [1,-1,0,Math.SQRT2], + [-1,1,0,Math.SQRT2], + [-1,-1,0,Math.SQRT2], + [1,0,1,Math.SQRT2], + [1,0,-1,Math.SQRT2], + [-1,0,1,Math.SQRT2], + [-1,0,-1,Math.SQRT2], + [0,1,1,Math.SQRT2], + [0,1,-1,Math.SQRT2], + [0,-1,1,Math.SQRT2], + [0,-1,-1,Math.SQRT2] +] + +class Path{ + constructor(startLocation, endLocation){ + this.startLocation = startLocation + this.endLocation = endLocation + + this.points = [] + } + + getPoints(){ + return this.points + } + + calculate(){ + this.locs = {} + this.points = [] + this.locs[this.startLocation.x+","+this.startLocation.y+","+this.startLocation.z]= { + location: this.startLocation, + parent: null, + distance: 0, + huristic: (Math.abs(this.startLocation.x-this.endLocation.x)+Math.abs(this.startLocation.y-this.endLocation.y)+Math.abs(this.startLocation.z-this.endLocation.z)) + } + + this.heap = new FlatQueue() + + this.heap.push(this.startLocation.x+","+this.startLocation.y+","+this.startLocation.z, this.locs[this.startLocation.x+","+this.startLocation.y+","+this.startLocation.z].huristic) + + let i = 0 + while(!this._iterate() && i<100000){ + i++ + } + } + + _iterate(){ + let currentKey = this.heap.pop() + let current = this.locs[currentKey] + if(current.location.x === this.endLocation.x && current.location.y === this.endLocation.y && current.location.z === this.endLocation.z){ + this.points.push([current.location.x, current.location.y, current.location.z]) + while(current.parent){ + current = this.locs[current.parent] + + this.points.push([current.location.x, current.location.y, current.location.z]) + } + return true + } + + for(let dir of directions){ + + let newLoc = { + x: current.location.x + dir[0], + y: current.location.y + dir[1], + z: current.location.z + dir[2] + } + + if(!this.locs[newLoc.x + "," + newLoc.y + "," + newLoc.z]){ + + if(World.getBlockAt(newLoc.x, newLoc.y, newLoc.z).getType().getID() === 0 && World.getBlockAt(newLoc.x, newLoc.y+1, newLoc.z).getType().getID() === 0){ + this.locs[newLoc.x + "," + newLoc.y + "," + newLoc.z] = { + location: newLoc, + parent: currentKey, + distance: current.distance+1, + huristic: Math.hypot((newLoc.x-this.endLocation.x),(newLoc.y-this.endLocation.y),(newLoc.z-this.endLocation.z))+(current.distance+dir[3])/2 + } + + this.heap.push(newLoc.x + "," + newLoc.y + "," + newLoc.z, this.locs[newLoc.x + "," + newLoc.y + "," + newLoc.z].huristic) + } + } + } + + return false + } +} + +export default Path
\ No newline at end of file |