// ==UserScript==
// @name Assault Bots Config Overrider [ HACK CHEAT ]
// @version 0.1
// @description Hopefully AssaultBots will improve!
// @author nekocell
// @namespace https://greasyfork.org/users/762895-nekocell
// @match https://games.crazygames.com/en_US/bot-machines/index.html
// @icon https://www.google.com/s2/favicons?domain=crazygames.com
// @run-at document-start
// @grant unsafeWindow
// ==/UserScript==
const rawdata2configs = function(rawData) {
const data = (new TextDecoder).decode(rawData);
const separators = data.match(/(@@!@@)+/g);
const configs = data.split('@@!@@')
.filter(config => config !== '')
.map(raw => JSON.parse(raw));
return {
configs: configs,
separators: separators
};
};
const configs2rawdata = function(configs, separators) {
const dataList = configs.map(config => JSON.stringify(config));
const fixedDataList = [];
for(let i = 0; i < dataList.length; ++i) {
const data = dataList[i];
const separator = separators[i];
fixedDataList.push(data);
fixedDataList.push(separator);
}
return (new TextEncoder()).encode(fixedDataList.join(''));
};
const editValues = function(configs, propName, value) {
const editValue = function(obj, propName) {
for(const prop in obj) {
if(prop === propName) {
obj[prop] = value;
}
else if(typeof obj[prop] === 'object') {
editValue(obj[prop], propName);
}
}
};
configs.forEach(config => {
editValue(config, propName);
});
};
const oldFetch = unsafeWindow.fetch;
const newFetch = async function(url, options) {
const response = await oldFetch(url, options);
if(url.endsWith('download_scriptable.php')) {
const data = await response.arrayBuffer();
const { configs, separators } = rawdata2configs(data);
configs[0].team0Name = 'AntiNeko';
configs[0].team1Name = 'Neko';
configs[33].aimAssistAllowed = true;
configs[33].afkTime = 99999;
configs[33].conquestCaptureSpeedPerPlayer = 0;
configs[33].deathScreenTime = 0;
configs[33].forcefieldTimeForBaseSpawn = 99999;
configs[33].forcefieldTimeForPointSpawn = 99999;
configs[33].forcefieldTimeToAllowShoot = 99999;
configs[33].regularForcefieldTime = 99999;
configs[33].gravity.y = -36;
configs[33].showHitPoints = true;
editValues(configs, 'human', true);
editValues(configs, 'alien', true);
editValues(configs, 'cost', 0);
//editValues(configs, 'beam', true);
//editValues(configs, 'shieldRegenMultiplier', 999);
//editValues(configs, 'healthRegenMultiplier', 999);
//editValues(configs, 'ammoMultiplier', 999);
editValues(configs, 'minLevel', 0);
editValues(configs, 'ungroundedSpeedMultiplier', 3);
editValues(configs, 'movementSpeedMultiplier', 3);
editValues(configs, 'enemyNametagShowOption', 0);
//editValues(configs, 'shieldRegenDelay', 0);
//editValues(configs, 'healthRegenDelay', 0);
editValues(configs, 'explosiveDamageMultiplier', -1);
editValues(configs, 'maxExplosiveDamage', -1);
editValues(configs, 'minExplosiveDamage', -1);
editValues(configs, 'maxSpread', 0);
editValues(configs, 'minSpread', 0);
//editValues(configs, 'guidedTowardsAirTargets', true);
editValues(configs, 'guidedBulletMaxDistance', 9999);
//editValues(configs, 'RPM', 9999);
editValues(configs, 'explosive', true);
editValues(configs, 'explosionRadius', 99999);
const newData = configs2rawdata(configs, separators);
response.body.getReader = () => undefined;
response.arrayBuffer = async () => {
console.log('%cConfig Overrided!!', 'color:red');
return newData;
};
}
return response;
};
Object.defineProperty(unsafeWindow, 'fetch', {
get() {
return newFetch;
},
set(newFetch) {
}
});