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