diff options
Diffstat (limited to 'src/features/stat_next_to_name')
-rw-r--r-- | src/features/stat_next_to_name/index.js | 193 | ||||
-rw-r--r-- | src/features/stat_next_to_name/metadata.json | 8 |
2 files changed, 201 insertions, 0 deletions
diff --git a/src/features/stat_next_to_name/index.js b/src/features/stat_next_to_name/index.js new file mode 100644 index 0000000..063a67b --- /dev/null +++ b/src/features/stat_next_to_name/index.js @@ -0,0 +1,193 @@ +/// <reference types="../../../../CTAutocomplete" /> +/// <reference lib="es2015" /> +import Feature from "../../featureClass/class"; +import soopyV2Server from "../../socketConnection"; +import SettingBase from "../settings/settingThings/settingBase"; +import * as numberUtils from "../../utils/numberUtils"; +import DropdownSetting from "../settings/settingThings/dropdownSetting"; +import { fetch } from "../../utils/networkUtils" +import ToggleSetting from "../settings/settingThings/toggle"; + +class StatNextToName extends Feature { + constructor() { + super() + } + + onEnable() { + new SettingBase("NOTE: A pink star thing (&d⚝§0)", "Means that player is also using SoopyV2", true, "stat_next_to_name_description", this) + this.statToShow = new DropdownSetting("Stat to show", "", "weight", "stat_selected_nexttoname", this, { + "weight": "Weight", + "catacombsLevel": "Catacombs Level", + "skillAvg": "Skill Average", + "skillAvgOver60": "Skill Average (Over 60)", + "totalSlayer": "Total Slayer Exp", + "networth": "Networth", + "classAverage": "Class Average", + "bestiary": "Bestiary" + }) + + this.decimals = { + "weight": 0, + "catacombsLevel": 2, + "skillAvg": 2, + "skillAvgOver60": 2, + "totalSlayer": 0, + "classAverage": 2, + "bestiary": 1, + "networth": "small" + } + + this.userStats = {} + + this.loadingStats = [] + this.lastWorldLoad = undefined + this.apiKeyThing = new ToggleSetting("Use ur api key for data loading", "Max of 12 requests/min", true, "api_key_stat_load", this) + + soopyV2Server.onPlayerStatsLoaded = (stats) => { this.playerStatsLoaded.call(this, stats) } + + soopyV2Server.apithingo = async (uuid, packetId) => { + let key = this.FeatureManager.features["globalSettings"].class.apiKeySetting.getValue() + if (!key) return + + let t = await fetch(`https://api.hypixel.net/skyblock/profiles?key=${key}&uuid=${uuid}`).text() + soopyV2Server.respondQueue(packetId, t) + } + + this.registerStep(false, 1, this.loadPlayerStatsTick) + this.registerEvent("worldLoad", this.worldLoad) + + this.registerEvent("playerJoined", this.playerJoined) + + this.worldLoad() + + + // respondQueue(id, data) { + // this.sendData({ + // type: "api", + // id, + // data + // }) + // } + + this.registerStep(false, 5, () => { + if (keyValid && this.apiKeyThing.getValue()) soopyV2Server.joinApiQ() + }) + + let keyValid = false + let key = this.FeatureManager.features["globalSettings"].class.apiKeySetting.getValue() + fetch("https://api.hypixel.net/key?key=" + key).json().then(d => { + if (d.success) { + keyValid = true + } + }) + } + + loadPlayerStatsTick() { + + if (this.lastWorldLoad && Date.now() - this.lastWorldLoad > 1000) { + World.getAllPlayers().forEach(player => { + if (this.userStats[player.getUUID().toString().replace(/-/g, "")]) return + if (Player.getUUID().replace(/-/g, "").toString().substr(12, 1) !== "4") return + this.loadPlayerStatsCache(player.getUUID().toString().replace(/-/g, ""), player.getName()) + }) + this.lastWorldLoad = undefined + } + + let nearestPlayer = undefined + let nearestPlayerName = undefined + let nearestDistance = Infinity + + World.getAllPlayers().forEach(player => { + if (this.userStats[player.getUUID().toString().replace(/-/g, "")]) { + this.updatePlayerNametag(player) + return + } + if (this.loadingStats.includes(player.getUUID().toString().replace(/-/g, ""))) return + if (Player.getUUID().replace(/-/g, "").toString().substr(12, 1) !== "4") return + + let dist = Math.pow(player.getX() - Player.getX(), 2) + Math.pow(player.getY() - Player.getY(), 2) + Math.pow(player.getZ() - Player.getZ(), 2) + if (dist < nearestDistance) { + nearestDistance = dist + nearestPlayer = player.getUUID().toString().replace(/-/g, "") + nearestPlayerName = player.getName() + } + }) + + if (nearestPlayer) { + this.loadPlayerStats(nearestPlayer, nearestPlayerName) + } + } + + worldLoad() { + let playerStats = this.userStats[Player.getUUID().toString().replace(/-/g, "")] + this.userStats = {} + this.loadingStats = [] + if (playerStats) { + this.userStats[Player.getUUID().toString().replace(/-/g, "")] = playerStats + } + + this.lastWorldLoad = Date.now() + + this.loadPlayerStatsCache(Player.getUUID().toString().replace(/-/g, ""), Player.getName()) + } + + playerJoined(player) { + if (player.getUUID().toString().replace(/-/g, "") === Player.getUUID().toString().replace(/-/g, "")) return + if (this.userStats[player.getUUID().toString().replace(/-/g, "")]) return + if (Player.getUUID().replace(/-/g, "").toString().substr(12, 1) !== "4") return + + this.loadPlayerStatsCache(player.getUUID().toString().replace(/-/g, ""), player.getName()) + } + + updatePlayerNametag(player) { + let stats = this.userStats[player.getUUID().toString().replace(/-/g, "")] + + let nameTagString = player.getName() + + nameTagString += " &2[" + if (stats.usingSoopyv2) nameTagString += "&d⚝&2" + if (stats.exists && stats[this.statToShow.getValue()] !== undefined && stats[this.statToShow.getValue()] !== null) { + if (this.decimals[this.statToShow.getValue()] === "small") { + nameTagString += numberUtils.addNotation("oneLetters", Math.round(stats[this.statToShow.getValue()])) + } else { + nameTagString += numberUtils.numberWithCommas(stats[this.statToShow.getValue()].toFixed(this.decimals[this.statToShow.getValue()])) + } + } else { + nameTagString += "?" + } + nameTagString += "]" + player.setNametagName(new TextComponent(nameTagString)); + } + + loadPlayerStats(uuid, username) { + // console.log("loading stats for " + uuid) + soopyV2Server.requestPlayerStats(uuid, username) + this.loadingStats.push(uuid) + } + + loadPlayerStatsCache(uuid, username) { + // console.log("loading stats for " + uuid) + soopyV2Server.requestPlayerStatsCache(uuid, username) + } + + playerStatsLoaded(stats) { + stats.bestiary /= 10 + this.userStats[stats.uuid] = stats + + + World.getAllPlayers().forEach(player => { + if (player.getUUID().toString().replace(/-/g, "") === stats.uuid) { + this.updatePlayerNametag(player) + return + } + }) + } + + onDisable() { + this.userStats = undefined + } +} + +module.exports = { + class: new StatNextToName() +}
\ No newline at end of file diff --git a/src/features/stat_next_to_name/metadata.json b/src/features/stat_next_to_name/metadata.json new file mode 100644 index 0000000..cd2f79c --- /dev/null +++ b/src/features/stat_next_to_name/metadata.json @@ -0,0 +1,8 @@ +{ + "name": "Stat next to name", + "description": "Shows a players skyblock stat next to their name in the world", + "isHidden": false, + "isTogglable": true, + "defaultEnabled": true, + "sortA": 0 +}
\ No newline at end of file |