aboutsummaryrefslogtreecommitdiff
path: root/src/features/waypoints
diff options
context:
space:
mode:
Diffstat (limited to 'src/features/waypoints')
-rw-r--r--src/features/waypoints/index.js323
-rw-r--r--src/features/waypoints/metadata.json8
-rw-r--r--src/features/waypoints/minewaypoints_socket.js49
-rw-r--r--src/features/waypoints/pathfind.js96
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