diff --git a/fx_core.js b/fx_core.js index 0e488cf..c67afcc 100644 --- a/fx_core.js +++ b/fx_core.js @@ -1,5 +1,5 @@ -const fx_version = '0.6.0.3'; // FX Client Version -const fx_update = 'Feb 15'; // FX Client Last Updated +const fx_version = '0.6.1'; // FX Client Version +const fx_update = 'Feb 21'; // FX Client Last Updated if (localStorage.getItem("fx_winCount") == undefined || localStorage.getItem("fx_winCount") == null) { @@ -9,12 +9,79 @@ if (localStorage.getItem("fx_winCount") == undefined || localStorage.getItem("fx var wins_counter = localStorage.getItem("fx_winCount"); } +function KeybindsInput(containerElement) { + this.container = containerElement; + this.keys = [ "key", "type", "value" ]; + this.objectArray = []; + this.addObject = function () { + this.objectArray.push({ key: "", type: "absolute", value: 1 }); + this.displayObjects(); + }; + document.getElementById("keybindAddButton").addEventListener("click", this.addObject.bind(this)); + this.displayObjects = function () { + // Clear the content of the container + this.container.innerHTML = ""; + if (this.objectArray.length === 0) return this.container.innerText = "No custom keybinds added"; + // Loop through the array and display input fields for each object + for (var i = 0; i < this.objectArray.length; i++) { + var objectDiv = document.createElement("div"); + // Create input fields for each key + this.keys.forEach(function (key) { + if (key === "type") { + var selectMenu = document.createElement("select"); + selectMenu.innerHTML = ''; + selectMenu.value = this.objectArray[i][key]; + selectMenu.addEventListener("change", this.updateObject.bind(this, i, key)); + objectDiv.appendChild(selectMenu); + return; + } + var inputField = document.createElement("input"); + inputField.type = key === "value" ? "number" : "text"; + if (key === "value") inputField.setAttribute("step", "0.1"); + if (key === "key") inputField.setAttribute("readonly", ""); + inputField.value = this.objectArray[i][key]; + if (key === "key") inputField.addEventListener("click", this.startKeyInput.bind(this, i, key)); + else inputField.addEventListener("input", this.updateObject.bind(this, i, key)); + // Append input field to the object div + objectDiv.appendChild(inputField); + }, this); + // Button to delete the object + var deleteButton = document.createElement("button"); + deleteButton.textContent = "Delete"; + deleteButton.addEventListener("click", this.deleteObject.bind(this, i)); + // Append delete button to the object div + objectDiv.appendChild(deleteButton); + // Append the object div to the container + this.container.appendChild(objectDiv); + } + }; + this.startKeyInput = function (index, property, event) { + event.target.value = "Press any key"; + document.addEventListener('keydown', this.updateObject.bind(this, index, property), { once: true }); + }; + this.updateObject = function (index, property, event) { + if (index >= this.objectArray.length) return; + // Update the corresponding property of the object in the array + const value = property === "value" ? parseFloat(event.target.value) : property === "key" ? event.key : event.target.value; + this.objectArray[index][property] = value; + if (property === "key") this.displayObjects(); + }; + this.deleteObject = function (index) { + // Remove the object from the array + this.objectArray.splice(index, 1); + // Display the updated input fields for objects + this.displayObjects(); + }; + return this; +} + var settings = { "fontName": "Trebuchet MS", "showBotDonations": false, "hideAllLinks": false, "realisticNames": false, //"customMapFileBtn": true + "attackPercentageKeybinds": [], }; var settingsManager = new (function() { var inputFields = { @@ -35,9 +102,12 @@ var settingsManager = new (function() { // should probably firgure out a way to do this without reloading - // You can't do it, localstorages REQUIRE you to reload window.location.reload(); }; + let keybindsInput = new KeybindsInput(document.getElementById("keybinds")); this.syncFields = function() { Object.keys(inputFields).forEach(function(key) { inputFields[key].value = settings[key]; }); Object.keys(checkboxFields).forEach(function(key) { checkboxFields[key].checked = settings[key]; }); + keybindsInput.objectArray = settings.attackPercentageKeybinds; + keybindsInput.displayObjects(); }; this.resetAll = function() { if (!confirm("Are you Really SURE you want to RESET ALL SETTINGS back to the default?")) return; @@ -138,6 +208,15 @@ var utils = new (function() { }; }); +const keybindFunctions = { setAbsolute: () => {}, setRelative: () => {} }; +const keybindHandler = key => { + const keybindData = settings.attackPercentageKeybinds.find(keybind => keybind.key === key); + if (keybindData === undefined) return false; + if (keybindData.type === "absolute") keybindFunctions.setAbsolute(keybindData.value); + else keybindFunctions.setRelative(keybindData.value); + return true; +}; + if (localStorage.getItem("fx_settings") !== null) { settings = {...settings, ...JSON.parse(localStorage.getItem("fx_settings"))}; } diff --git a/game.js b/game.js index 519aef3..e4ab240 100644 --- a/game.js +++ b/game.js @@ -529,6 +529,7 @@ function f0() { } function fH(cE) { + if (keybindHandler(cE.key)) return; fJ() || ("ArrowLeft" === cE.key || "a" === cE.key ? fs.g1(3) : "ArrowUp" === cE.key || "w" === cE.key ? fs.g1(0) : "ArrowRight" === cE.key || "d" === cE.key ? fs.g1(1) : "ArrowDown" === cE.key || "s" === cE.key ? fs.g1(2) : "1" === cE.key ? ck.g2(.75) : "2" === cE.key ? ck.g2(7 / 8) : "3" === cE.key ? ck.g2(.9375) : "4" === cE.key ? ck.g2(31 / 32) : "5" === cE.key ? ck.g2(32 / 31) : "6" === cE.key ? ck.g2(16 / 15) : "7" === cE.key ? ck.g2(8 / 7) : "8" === cE.key ? ck.g2( 4 / 3) : "+" === cE.key ? 0 !== aY && cY.eF(Math.floor(eG / 2), Math.floor(eH / 2), -200) : "-" === cE.key ? 0 !== aY && cY.eF(Math.floor(eG / 2), Math.floor(eH / 2), 200) : "c" === cE.key && 0 !== aY && cs.g3()) @@ -5414,6 +5415,11 @@ function a85() { 2), ck.aC - 2 * a8C, a8B), aK.fillRect(Math.floor(aQ - 1.25 * ck.aC) + a8C, Math.floor((ck.aC - a8B) / 2), ck.aC - 2 * a8C - a8C % 2, a8B), aK.fillRect(Math.floor(aQ - 1.25 * ck.aC) + Math.floor((ck.aC - a8B) / 2), a8C, a8B, ck.aC - 2 * a8C - a8C % 2), a87 = bG.kI.a2n(kY, ck.pc()), aK.fillText(bG.hZ.ha(a87) + " (" + bG.hZ.i5(100 * sr, 0) + ")", Math.floor(.5 * aQ), rG) } + this.setAbsolutePercentage = function(newPercentage) { + sr = newPercentage; + }; + keybindFunctions.setAbsolute = this.setAbsolutePercentage; + keybindFunctions.setRelative = (arg1) => ck.g2(arg1); function a8G(ee) { return !(1 < ee && 1 === sr || (1 < ee && ee * sr - sr < 1 / 1024 ? ee = (sr + 1 / 1024) / sr : ee < 1 && sr - ee * sr < 1 / 1024 && (ee = (sr - 1 / 1024) / sr), sr = yP.hr(sr * ee, 1 / 1024, 1), a89(), 0)) diff --git a/index.html b/index.html index bfb8b40..1d82e5c 100644 --- a/index.html +++ b/index.html @@ -76,6 +76,9 @@ Bring back the custom map file button after the creator removed it in 1.83.0 --> +

Keybinds

+
+