Gats.io - Vaakir's hack pack GUI

Hacks, and color mod v1 by Vaakir with the colod mod v2 from nitrogem35

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

//******************************************************** GATS:IO SCRIPT ********************************************************************/
// ==UserScript==
// @name         Gats.io - Vaakir's hack pack GUI
// @namespace    http://tampermonkey.net/
// @version      3.0
// @description  Hacks, and color mod v1 by Vaakir with the colod mod v2 from nitrogem35
// @author       Vaakir youtube & nitrogem35
// @run-at       document-end
// @match        https://gats.io/
// @grant        none
// ==/UserScript==

// COMMENT        : I got bored, okay? So I just made a GUI for some of the scripts, hope y'all like it, I'm satisfied :>
// GATS DEVELOPER : (translate) Ich werde wahrscheinlich diese .io-Spiele verlassen, das Ändern der Funktion [Namen] reicht aus, um dieses Skript zu patchen. Bis das passiert, trololol :joy:
// GATS DEVELOPER : Im probably leaving gonna these .io games, changing the function [names] is enough to patch this script. Untill that happens, trololol :joy:

(function() {

let overlayHTML = `
<link href="https://fonts.googleapis.com/css?family=Orbitron:900" rel="stylesheet"/>
<div id="box">
    <div class="ou" id="box2">
        <p style="color:white;">⚡ Gats.io Full Hack pack ⚡</p>
        <p id="ytlink"><a href="https://www.youtube.com/channel/UC2m-9cAoT8EEO2dqWlk4Yfw" target="_blank">Vaakir Youtube</a></p>
        <section><label>Aimbot [Right click]</label>                         <input id="aimbot"             type="checkbox" value="#0000ff"></section>
        <section><label>Zoom [mousewheel] </label><div class="checked"></div></section>
        <section><label>Mine detection     </label><div class="checked"></div></section>
        <section><label>Ghost detection    </label><div class="checked"></div></section>
        <section><label>Silencer detection </label><div class="checked"></div></section>

        <section><label>Crate</label>                                        <input id="acrate"             type="color"    value="#dfbf9f"></section>
        <section><label>Long Crate</label>                                   <input id="alongCrate"         type="color"    value="#bec8dd"></section>
        <section><label>Crate Border</label>                                 <input id="acrateborder"       type="color"    value="#808080"></section>
        <section><label>Long Crate Border</label>                            <input id="alongcrateborder"   type="color"    value="#808080"></section>
        <section><label>Player Crate Border</label>                          <input id="playercrateborder"  type="color"    value="#808080"></section>
        <section><label>Random Crate Colors</label>                          <input id="arandom"            type="checkbox" value="#0000ff"></section>
        <section><label>Random Crate Borders</label>                         <input id="arandom2"           type="checkbox" value="#0000ff"></section>
        <section><label>Seizure Mode</label>                                 <input id="seizure"            type="checkbox" value="#0000ff"></section>
        <section><label>Vaakir Mode</label>                                  <input id="vaakirmode"         type="checkbox" value="#0000ff"></section>
        <section><label>Reset To Defaults</label>                            <input id="default"            type="checkbox" value="#0000ff"></section>
        <section><label>Multiboxing </label><div class="checked notchecked"></div></section>
        <section><label>Auto upgrading </label><div class="checked notchecked"></div></section>
        <section><label>Scrolling text </label><div class="checked notchecked"></div></section>
    </div>
    <button class="ou" id="accordian">Toggle</button>
</div>
<style>
#box {
    z-index: 10;
    position: absolute;
    bottom: 10vh;
    left: 10px;}
#box2 {
    padding: 15px;
    margin-bottom: 5px}
section {
    display: flex;
    justify-content: space-between;margin:5px;}
.ou {
    background-color: rgba(85,85,85,0.5);
    letter-spacing: 3px;

    font-weight: bold;
    font-size: 15px;
    font-family: Orbitron;
    color:white;}
p { text-align: center;border-bottom:1px solid white;}
#ytlink { border:0;}
#ytlink a{ color:lime;}
#accordian {
    width: 100%;
    border:0;}
label { font-weight: bold;}
input {
    margin-top: auto;
    margin-bottom: auto;
    transform: scale(1.3);}
input:hover { cursor: pointer;}
input:focus { box-shadow: 0 0 10px #9ecaed;}
input[type=checkbox] { transform: scale(2.2);outline=none;}
input[type=radio] { border-top: auto;}
input[type=color] { width: 50px;}
.checked {
    height: 20px;
    width: 20px;
    box-shadow: -1px -2px 5px gray;
    border: 3px solid gray;
    background-color: green;
    margin-top: auto;
    margin-bottom: auto;
    box-shadow: 2 2 2px #a0a0a0;
    width:20px;
    transform: scale(1.5);}
.notchecked { background-color: red;}
</style>
`

// Usefull functions..
function get(x)            { return document.getElementById(x); }
function rColor()          { return rgbToHex(Math.floor(Math.random()*255),Math.floor(Math.random()*255),Math.floor(Math.random()*255)); }
function componentToHex(c) { var hex = c.toString(16);return hex.length == 1 ? "0" + hex : hex; }
function rgbToHex(r, g, b) { return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b); }

// Setting up the html div
let overlay             = document.createElement("div");
    overlay.innerHTML   = overlayHTML;
    document.body.appendChild(overlay);

// Getting variables from div by id's
let acrate              = get("acrate"),
    alongCrate          = get("alongCrate"),
    acrateborder        = get("acrateborder"),
    alongcrateborder    = get("alongcrateborder"),
    aplayercrateborder  = get("playercrateborder"),
    ran                 = get("arandom"),
    ran2                = get("arandom2"),
    seizure             = get("seizure"),
    defaults            = get("default"),
    acc                 = get("accordian"),
    vaakirmod           = get("vaakirmode"),
    aimbot              = get("aimbot");

let loop                = undefined;
let defaultColors       = ["#dfbf9f","#bec8dd","#808080"];
let zoom                = 1;
let initAimbot          = false;

// Color picker on change
alongCrate.onchange         = function() { window.longCrate[0][1][1][3] = this.value; }
acrate.onchange             = function() { window.crate[0][1][1][3] = this.value;     }
acrateborder.onchange       = function() { window.crate[0][0][1][3] = this.value;     }
alongcrateborder.onchange   = function() { window.longCrate[0][0][1][3] = this.value; }
aplayercrateborder.onchange = function() { window.userCrate[0][0][1][3] = this.value; }
ran.onclick = function() {
    if (this.checked) {
        let c=rColor(), c2=rColor();
        window.crate[0][1][1][3]=c; acrate.value=c;
        window.longCrate[0][1][1][3]=c2;alongCrate.value=c2;
        this.checked = false;
    }
}
ran2.onclick = function() {
    if (this.checked) {
        let c=rColor(), c2=rColor(), c3=rColor();
        window.crate[0][0][1][3]=c;acrateborder.value=c;
        window.longCrate[0][0][1][3]=c2;alongcrateborder.value=c2;
        window.userCrate[0][0][1][3]=c3;aplayercrateborder.value=c3;
        this.checked = false;
    }
}
seizure.onclick = function() {
    if(!loop) {
        loop = setInterval(function(){
            let c=rColor(), c2=rColor();
            window.crate[0][1][1][3] =c;acrate.value=c;
            window.longCrate[0][1][1][3]=c2;alongCrate.value=c2;
            let e=rColor(), e2=rColor(), e3=rColor();
            window.crate[0][0][1][3]=e;acrateborder.value=e;
            window.longCrate[0][0][1][3]=e2;alongcrateborder.value=e2;
            window.userCrate[0][0][1][3]=e3;aplayercrateborder.value=e3;
        }, 100)
    }
else { clearInterval(loop); loop=undefined; }
}
defaults.onclick = function() {
    if (this.checked) {
        window.crate[0][1][1][3]     = defaultColors[0]; acrate.value             = defaultColors[0];
        window.crate[0][0][1][3]     = defaultColors[2]; acrateborder.value       = defaultColors[2];
        window.longCrate[0][1][1][3] = defaultColors[1]; alongCrate.value         = defaultColors[1];
        window.longCrate[0][0][1][3] = defaultColors[2]; alongcrateborder.value   = defaultColors[2];
        window.userCrate[0][0][1][3] = defaultColors[2]; aplayercrateborder.value = defaultColors[2];
        this.checked = false;
    }
}
vaakirmod.onclick = function() {
    window.crate[0][0][1][3]     = "#4dd8f0"; acrate.value           = "#4dd8f0";
    window.crate[0][1][1][3]     = "#b1e9f9"; acrateborder.value     = "#b1e9f9";
    window.longCrate[0][0][1][3] = "#303030"; alongCrate.value       = "#303030";
    window.longCrate[0][1][1][3] = "#646464"; alongcrateborder.value = "#646464";
    this.checked = false;
}

// Toggle functionality
acc.onclick = function() {
    let panel = get("box2");
    if (panel.style.display == "grid") panel.style.display = "none";
    else { panel.style.display = "grid"; }
}

// Zoom hack on mousewheel scrolling
window.addEventListener("wheel", function(e) {
    let dir = Math.sign(e.deltaY);
    if (dir== 1) {j7*=1.1;j8*=1.1;a1();zoom*=1.1;}
    if (dir==-1) {j7*=0.95;j8*=0.95;a1();zoom*=0.95;}
});

// The script just commits suicide without a timeout apparantly. Bc of (0) data
setTimeout(function(){
    // Shows landmines
    landMine[0].forEach((a,i)=>{landMine[0][i][1][3]="#000000"});

    // Shows camos
    setInterval(()=>{Object.keys(RD.pool).forEach((a,i)=>{
        if(RD.pool[i].ghillie){RD.pool[i].ghillie=0;RD.pool[i].invincible=1}
    })},30);

    // Shows silencers
    setInterval(()=>{Object.keys(RC.pool).forEach((a,i)=>{
        if(RC.pool[i].silenced){RC.pool[i].silenced=0}
    })},30);
}, 3000);

// Aimbot w/tracers [I know, I know, the code could be prettified, but fuck that, lemme just publish it as it is, I have other projects calling..]
let hw   = document.getElementById("canvas");
let can1 = document.createElement("canvas");
can1.id  = "c1"; can1.width = 1224; can1.height = 768;
can1.style.zIndex = 1; can1.style.position = "absolute";
document.getElementsByTagName("body")[0].appendChild(can1);
let myctx = can1.getContext("2d");

aimbot.onclick = function() {
    if (this.checked == false) myctx.clearRect(0, 0, can1.width, can1.height);
}
// Right click to switch aimbot on/off
document.addEventListener('contextmenu', function(e) {
    if (e.which == 3) {
        if (aimbot.checked) {
            aimbot.checked=false;
            myctx.clearRect(0, 0, can1.width, can1.height);
        } else aimbot.checked = true;
    }
});

// Im fully aware I could optimize and shorten this down 2 times
setInterval(function(){
    if (aimbot.checked) {
        can1.width  = hw.width;
        can1.height = hw.height;
        let enemies = [];
        let me = RD.pool[c3];
        for(let player of Object.values(RD.pool)) {
            if(!player.activated) continue
            if(player.id == me.id) continue
            if(player.teamCode) if(player.teamCode == me.teamCode) continue
            if(player.hp == 0) continue
            enemies.push(player)
        }

        let diX;
        let diY;
        let num = 0;
        let dis = 10000;
        for (let i = 0;i<enemies.length;i++) {
            let ndis = Math.sqrt( (enemies[i].x-RD.pool[c3].x)**2 + (enemies[i].y-RD.pool[c3].y)**2 );
            if (ndis < dis) {
                dis = ndis;
                num = i;
            }
        }
        dis /= 35;

        let playerScreenPos    = c2.getRelPos(RD.pool[c3]);
        playerScreenPos.x *= j5;
        playerScreenPos.y *= j5;
        let angle = RD.pool[c3].mouseAngle*(Math.PI / 180);
        let playerGunPos = {
            x: playerScreenPos.x+Math.cos(angle-Math.PI/18)*(80*j5),
            y: playerScreenPos.y+Math.sin(angle-Math.PI/18)*(80*j6)
        };

        if (enemies.length >= 1) {
            diX = (enemies[num].x-RD.pool[c3].x)+playerScreenPos.x;
            diY = (enemies[num].y-RD.pool[c3].y)+playerScreenPos.y;
            let newY, newX, me=RD.pool[c3];

            // Not necessary but, yk, I found it pretty usefull
            if (enemies[num].dashing == 0) {
                newX = diX+enemies[num].spdX*dis;
                newY = diY+enemies[num].spdY*dis;
            } else {
                newX = diX;
                newY = diY;
            }
            if (aimbot.checked) {a57({clientX:newX,clientY:newY});}
        }

        myctx.strokeStyle = "red";
        myctx.lineWidth   = 3;
        for (let i=0;i<enemies.length;i++) {
            dis = Math.sqrt(  (enemies[i].x-RD.pool[c3].x)**2 + (enemies[i].y-RD.pool[c3].y)**2  )/35;
            diX = (enemies[i].x-RD.pool[c3].x)+playerScreenPos.x+enemies[i].spdX*dis;
            diY = (enemies[i].y-RD.pool[c3].y)+playerScreenPos.y+enemies[i].spdY*dis

            myctx.moveTo(playerGunPos.x,playerGunPos.y);
            myctx.lineTo(diX,diY);
            myctx.stroke();
        }
    }
});
})();