Update v0.6.1; Add keybinds
parent
54178c470d
commit
5fdf36ddad
22
build.js
22
build.js
|
@ -13,6 +13,14 @@ const replaceOne = (expression, replaceValue) => {
|
||||||
script = script.replace(expression, replaceValue);
|
script = script.replace(expression, replaceValue);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
const matchOne = (expression) => {
|
||||||
|
const result = expression.exec(script);
|
||||||
|
if (result === null) throw new Error("no match for: ") + expression;
|
||||||
|
if (expression.exec(script) !== null) throw new Error("more than one match for: " + expression);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
// https://stackoverflow.com/a/63838890
|
||||||
|
const escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&');
|
||||||
|
|
||||||
//const dictionary = { __dictionaryVersion: '1.90.0 4 Feb 2024', playerId: 'bB', playerNames: 'hA', playerBalances: 'bC', playerTerritories: 'bj', gIsSingleplayer: 'fc', gIsTeamGame: 'cH' };
|
//const dictionary = { __dictionaryVersion: '1.90.0 4 Feb 2024', playerId: 'bB', playerNames: 'hA', playerBalances: 'bC', playerTerritories: 'bj', gIsSingleplayer: 'fc', gIsTeamGame: 'cH' };
|
||||||
//if (!script.includes(`"${dictionary.__dictionaryVersion}"`)) throw new Error("Dictionary is outdated.");
|
//if (!script.includes(`"${dictionary.__dictionaryVersion}"`)) throw new Error("Dictionary is outdated.");
|
||||||
|
@ -89,6 +97,20 @@ replaceOne(/(this\.\w+=function\((?<mouseX>\w+),(?<mouseY>\w+)\){[^}]+?)if\((?<c
|
||||||
'if ($<isMenuOpened>) $<end>');
|
'if ($<isMenuOpened>) $<end>');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{ // Keybinds
|
||||||
|
// match required variables
|
||||||
|
const { 0: match, groups: { attackBarObject, setRelative } } = matchOne(/:"."===(\w+\.key)\?(?<attackBarObject>\w+)\.(?<setRelative>\w+)\(31\/32\):"."===\1\?\2\.\3\(32\/31\):/g,);
|
||||||
|
// create a setAbsolutePercentage function on the attack percentage bar object,
|
||||||
|
// and also register the keybind handler functions
|
||||||
|
replaceOne(/}(function \w+\((\w+)\){return!\(1<\2&&1===(?<attackPercentage>\w+)\|\|\(1<\2&&\2\*\3-\3<1\/1024\?\2=\(\3\+1\/1024\)\/\3:\2<1)/g,
|
||||||
|
"} this.setAbsolutePercentage = function(newPercentage) { $<attackPercentage> = newPercentage; }; "
|
||||||
|
+ "keybindFunctions.setAbsolute = this.setAbsolutePercentage; "
|
||||||
|
+ `keybindFunctions.setRelative = (arg1) => ${attackBarObject}.${setRelative}(arg1); $1`);
|
||||||
|
// insert keybind handling code into the keyDown handler function
|
||||||
|
replaceOne(new RegExp(/(function \w+\((?<event>\w+)\){)([^}]+matched)/g.source.replace(/matched/g, escapeRegExp(match)), "g"),
|
||||||
|
"$1 if (keybindHandler($<event>.key)) return; $3");
|
||||||
|
}
|
||||||
|
|
||||||
// Enforce custom font name
|
// Enforce custom font name
|
||||||
script = script.replace(/"px sans-serif"/g, '"px " + settings.fontName');
|
script = script.replace(/"px sans-serif"/g, '"px " + settings.fontName');
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
const fx_version = '0.6.0.3'; // FX Client Version
|
const fx_version = '0.6.1'; // FX Client Version
|
||||||
const fx_update = 'Feb 15'; // FX Client Last Updated
|
const fx_update = 'Feb 21'; // FX Client Last Updated
|
||||||
|
|
||||||
|
|
||||||
if (localStorage.getItem("fx_winCount") == undefined || localStorage.getItem("fx_winCount") == null) {
|
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");
|
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 = '<option value="absolute">Absolute</option><option value="relative">Relative</option>';
|
||||||
|
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 = {
|
var settings = {
|
||||||
"fontName": "Trebuchet MS",
|
"fontName": "Trebuchet MS",
|
||||||
"showBotDonations": false,
|
"showBotDonations": false,
|
||||||
"hideAllLinks": false,
|
"hideAllLinks": false,
|
||||||
"realisticNames": false,
|
"realisticNames": false,
|
||||||
//"customMapFileBtn": true
|
//"customMapFileBtn": true
|
||||||
|
"attackPercentageKeybinds": [],
|
||||||
};
|
};
|
||||||
var settingsManager = new (function() {
|
var settingsManager = new (function() {
|
||||||
var inputFields = {
|
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
|
// should probably firgure out a way to do this without reloading - // You can't do it, localstorages REQUIRE you to reload
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
};
|
};
|
||||||
|
let keybindsInput = new KeybindsInput(document.getElementById("keybinds"));
|
||||||
this.syncFields = function() {
|
this.syncFields = function() {
|
||||||
Object.keys(inputFields).forEach(function(key) { inputFields[key].value = settings[key]; });
|
Object.keys(inputFields).forEach(function(key) { inputFields[key].value = settings[key]; });
|
||||||
Object.keys(checkboxFields).forEach(function(key) { checkboxFields[key].checked = settings[key]; });
|
Object.keys(checkboxFields).forEach(function(key) { checkboxFields[key].checked = settings[key]; });
|
||||||
|
keybindsInput.objectArray = settings.attackPercentageKeybinds;
|
||||||
|
keybindsInput.displayObjects();
|
||||||
};
|
};
|
||||||
this.resetAll = function() {
|
this.resetAll = function() {
|
||||||
if (!confirm("Are you Really SURE you want to RESET ALL SETTINGS back to the default?")) return;
|
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) {
|
if (localStorage.getItem("fx_settings") !== null) {
|
||||||
settings = {...settings, ...JSON.parse(localStorage.getItem("fx_settings"))};
|
settings = {...settings, ...JSON.parse(localStorage.getItem("fx_settings"))};
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,6 +76,9 @@
|
||||||
Bring back the custom map file button after the creator removed it in 1.83.0
|
Bring back the custom map file button after the creator removed it in 1.83.0
|
||||||
<input type="checkbox" id="settings_custommapfileinput"><span class="checkmark"></span>
|
<input type="checkbox" id="settings_custommapfileinput"><span class="checkmark"></span>
|
||||||
</label>-->
|
</label>-->
|
||||||
|
<p>Keybinds</p>
|
||||||
|
<div id="keybinds" class="arrayinput"></div>
|
||||||
|
<button id="keybindAddButton">Add</button>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<footer>
|
<footer>
|
||||||
|
|
|
@ -36,7 +36,8 @@ hr {
|
||||||
}
|
}
|
||||||
|
|
||||||
.window button,
|
.window button,
|
||||||
.window input {
|
.window input,
|
||||||
|
.window select {
|
||||||
background-color: rgba(0, 0, 0, 0.7);
|
background-color: rgba(0, 0, 0, 0.7);
|
||||||
color : white;
|
color : white;
|
||||||
font-size : 20px;
|
font-size : 20px;
|
||||||
|
|
Loading…
Reference in New Issue