surrviv.io Hack

surviv.io Hack

// ==UserScript==
// @name         surrviv.io Hack
// @description  surviv.io Hack
// @version      1.0.0
// @match       *://surviv.io/*
// @author       IceHacks
// @grant        GM_xmlhttpRequest
// @run-at       document-start
// @namespace https://greasyfork.org/users/703117
// ==/UserScript==

class Hack {
        constructor() {
        this._enabled = true
        this.name = "esp"
        this.UI = {
            name: "ESP",
            description: "Shows where players are at",
        }
        this._options = [
            {
                value: true,
                name: "laser",
                UI: {
                    name: "Flashlight",
                },
            },
            {
                value: true,
                name: "nade",
                UI: {
                    name: "Blast Radius",
                },
            },
            {
                value: 2,
                name: "width",
                UI: {
                    name: "Tracer Width",
                },
            }
        ]
        this.values = {
            pixi: null,
        }
    }

    option(o) {
        let op
        try {
            op = this._options.filter(k => k.name === o)[0].value
        } catch (e) {
            op = false
        }
        return op
    }

    get enabled() {
        return this._enabled
    }

    set enabled(t) {
        this._enabled = t
    }

    names(player) {
        if (!player) return
        if (
            !player.nameText._text ||
            player.nameText._text == "" ||
            player.nameText._text.length < 1
        )
            return

        player.nameText.tint = 0xff0000

        player.nameText.visible = true
    }

    draw(enemies, activePlayer, data, dataAccessor) {
        if(!enemies || !activePlayer)  {
            return;
        }
        let points = enemies.map(enemy => {
            return {
                x: (dataAccessor.GetPlayerPosition(enemy).x - dataAccessor.GetPlayerPosition(activePlayer).x) * 16,
                y: (dataAccessor.GetPlayerPosition(activePlayer).y - dataAccessor.GetPlayerPosition(enemy).y) * 16,
                img: enemy.img || false,
                type: enemy.__type,
                id: enemy.__id,
                layer: dataAccessor.GetPlayerLayer(enemy),
            }
        });
        let pixi = this.values.pixi
        if(!pixi) {
            pixi = new window.PIXI.Graphics();
            this.values.pixi = pixi;
            activePlayer.container.addChild(pixi);
            activePlayer.container.setChildIndex(pixi, 0);
        }
        if(!pixi.graphicsData) {
            return;
        }
        pixi.clear();
        points.forEach(point => {
            if(point.type == 2 && point.layer !== dataAccessor.GetPlayerLayer(activePlayer)) {
                return;
            }
            pixi.lineStyle(this.option("width"), 0xff0000, 0.5);
            if(point.layer !== dataAccessor.GetPlayerLayer(activePlayer)) {
                pixi.lineStyle(this.option("width"), 0xffffff, 0.5);
            }
            if(point.type == 2) {
                pixi.lineStyle(this.option("width"), 0xffff00, 0.5);
            }
            pixi.moveTo(0, 0);
            pixi.lineTo(point.x, point.y);
        });
        if(data.aimPred) {
            pixi.lineStyle(2, 0xffffff, 0.5);
            pixi.moveTo(0, 0);
            pixi.lineTo(
                (data.aimPred.x - dataAccessor.GetPlayerPosition(activePlayer).x) * 16,
                (dataAccessor.GetPlayerPosition(activePlayer).y - data.aimPred.y) * 16
            )
        }
        enemies.forEach(n => {
            if(n.__type == 1) { 
                this.names(n); 
            }
        });
        pixi.lineStyle(0);
        if(this.option("nade")) {
            data.getObjects()
                .filter(obj => {
                    if(obj.__type === data.data.Type.Projectile ||
                        (obj.img &&
                            obj.img.match(/barrel-/g) &&
                            obj.smokeEmitter &&
                            data.items[obj.type].explosion)) 
                    {
                        return true;
                    }
                    return false;
                })
                .forEach(obj => {
                    //If the object is inside a bunker and you're not etc, make the blast radius white
                    if(obj.layer !== dataAccessor.GetPlayerLayer(activePlayer)) {
                        pixi.beginFill(0xffffff, 0.3);
                    } else {
                        pixi.beginFill(0xff0000, 0.2) ;
                    }
                    pixi.drawCircle(
                        (obj.pos.x - dataAccessor.GetPlayerPosition(activePlayer).x) * 16,
                        (dataAccessor.GetPlayerPosition(activePlayer).y - obj.pos.y) * 16,
                        (data.explosions[
                            data.items[obj.type].explosionType ||
                            data.items[obj.type].explosion
                                ].rad.max +
                            1) *
                        16
                    )
                });
        }
        points = null;
    }

    end() {
        this.values.pixi = null;
        this.laser = null;
    }

    findWeap(player, game, dataAccessor) {
        var weap = dataAccessor.GetPlayerWeaponType(player);
        return weap && game.guns[weap] ? game.guns[weap] : false;
    }

    findBullet(curWeapon, game) {
        return !!curWeapon ? game.bullets[curWeapon.bulletType] : false;
    }

    laserPointer(
        curBullet,
        curWeapon,
        curPlayer,
        acPlayer,
        color,
        opac,
        dataAccessor
    ) {
        if(!curPlayer || !curPlayer.container) {
            return;
        }

        this.laser = this.laser || {};

        var laser = this.laser;
        var lasic = {};

        let isMoving =
            curPlayer.posOldOld &&
            (dataAccessor.GetPlayerPosition(curPlayer).x != curPlayer.posOldOld.x ||
            dataAccessor.GetPlayerPosition(curPlayer).y != curPlayer.posOldOld.y);

        if(curBullet) {
            lasic.active = true;
            lasic.range = curBullet.distance * 16.25;
            lasic.direction =
                Math.atan2(
                    dataAccessor.GetPlayerDirection(curPlayer).x,
                    dataAccessor.GetPlayerDirection(curPlayer).y
                ) -
                Math.PI / 2;
            lasic.angle =
                ((curWeapon.shotSpread +
                    (isMoving ? curWeapon.moveSpread : 0)) *
                    0.01745329252) /
                2;
        } else {
            lasic.active = false;
        }
        var draw = laser.draw;
        if(!draw) {
            draw = new window.PIXI.Graphics();
            laser.draw = draw;
            curPlayer.container.addChildAt(draw, 0);
        }
        if(!draw.graphicsData) {
            return;
        }
        if(!lasic.active) {
            return;
        }
        var curPlayerPos = dataAccessor.GetPlayerPosition(curPlayer);
        var acPlayerPos = dataAccessor.GetPlayerPosition(acPlayer);
        var center = {
            x: (curPlayerPos.x - acPlayerPos.x) * 16,
            y: (acPlayerPos.y - curPlayerPos.y) * 16,
        };
        var radius = lasic.range;
        var angleFrom = lasic.direction - lasic.angle;
        var angleTo = lasic.direction + lasic.angle;
        angleFrom =
            angleFrom > Math.PI * 2
                ? angleFrom - Math.PI * 2
                : angleFrom < 0
                ? angleFrom + Math.PI * 2
                : angleFrom;
        angleTo =
            angleTo > Math.PI * 2
                ? angleTo - Math.PI * 2
                : angleTo < 0
                ? angleTo + Math.PI * 2
                : angleTo;
        draw.beginFill(color || 0x0000ff, opac || 0.3);
        draw.moveTo(center.x, center.y);
        draw.arc(center.x, center.y, radius, angleFrom, angleTo);
        draw.lineTo(center.x, center.y);
        draw.endFill();
    }

    loop(dataAccessor, player, input, data, plugins) {
        var enemies = data
            .getEnemies(
                plugins["aimbot"] ? plugins["aimbot"].option("object") : false
            )
            .filter(p =>
                p && dataAccessor.GetPlayerNetData(p)
                    ? plugins["aimbot"] && plugins["aimbot"].option("down")
                    ? true
                    : !dataAccessor.IsPlayerDowned(p)
                    : true
            );
        this.draw(enemies, player, data, dataAccessor);
        var curWeapon = this.findWeap(player, data, dataAccessor);
        var curBullet = this.findBullet(curWeapon, data);
        if(this.laser && this.laser.draw) {
            this.laser.draw.clear();
        }
        if(!this.option("laser")) {
            return;
        }
        this.laserPointer(
            curBullet,
            curWeapon,
            player,
            player,
            undefined,
            undefined,
            dataAccessor
        );
        enemies
            .filter(n => n.__type == 1)
            .forEach(enemy => {
                var eW = this.findWeap(enemy, data, dataAccessor)
                this.laserPointer(
                    this.findBullet(eW, data),
                    eW,
                    enemy,
                    player,
                    "0",
                    0.2,
                    dataAccessor
                )
            });
        enemies = null;
    }
}