Base Zones REAL

credits to cazka for basically 99% of this script, no this is not a multiboxing script

目前为 2021-10-11 提交的版本。查看 最新版本

// ==UserScript==
// @name         Base Zones REAL
// @description  credits to cazka for basically 99% of this script, no this is not a multiboxing script
// @version      1.0.8
// @author       none
// @match        *://diep.io/*
// @grant        GM_addStyle
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_addValueChangeListener
// @grant        GM_removeValueChangeListener
// @namespace https://greasyfork.org/users/790354
// ==/UserScript==
'use strict';
(function() {
	var isActive = true;
	function f(e){
		if (!isActive) return;
		var a = new KeyboardEvent("keydown", {
			bubbles: true,
			cancelable: true,
			shiftKey: false
		});
		delete a.keyCode;
		Object.defineProperty(a, "keyCode", {
			"value": 76
		});
		dispatchEvent(a);
	}
	function a(e) {
		addEventListener(e, f);
	}
	for (var i of ["focus", "blur", "keyup"]) {
		a(i);
	}
	addEventListener("keydown", function(e) {
		if (e.keyCode == 76 && e.isTrusted) {
			isActive ^= true;
		}
	});
}());
function fillBlue2(flag) {
    if (flag == 1) {
    if (player.dead) return;
    ctx.save();
    ctx.globalAlpha = 0.12;
    if (player.gamemode === 'teams') {
    ctx.fillStyle = '#006480';
    ctx.beginPath();
    ctx.fillRect(0,0,1920,1080);
    }
    ctx.restore();
    }
}
function fillRed2(flag) {
    if (flag == 1) {
    if (player.dead) return;
    ctx.save();
    ctx.globalAlpha = 0.12;
    if (player.gamemode === 'teams') {
    ctx.fillStyle = '#963033';
    ctx.beginPath();
    ctx.fillRect(0,0,1920,1080);
    }
    ctx.restore();
    }
}
function fillBlue(flag) {
    if (flag == 1) {
    if (player.dead) return;
    ctx.save();
    ctx.globalAlpha = 0.12;
    if (player.gamemode === '4teams') {
    ctx.fillStyle = '#006480';
    ctx.beginPath();
    ctx.fillRect(0,0,1920,1080);
    }
    if (player.gamemode === 'teams') {
    ctx.fillStyle = '#006480';
    ctx.beginPath();
    ctx.fillRect(0,0,1920,1080);
    }
    ctx.restore();
    }
}
function fillRed(flag) {
    if (flag == 1) {
    if (player.dead) return;
    ctx.save();
    ctx.globalAlpha = 0.12;
    if (player.gamemode === '4teams') {
    ctx.fillStyle = '#963033';
    ctx.beginPath();
    ctx.fillRect(0,0,1920,1080);
    }
    if (player.gamemode === 'teams') {
    ctx.fillStyle = '#963033';
    ctx.beginPath();
    ctx.fillRect(0,0,1920,1080);
    }
    ctx.restore();
    }
}
function fillGreen(flag) {
    if (flag == 1) {
    if (player.dead) return;
    ctx.save();
    ctx.globalAlpha = 0.12;
    if (player.gamemode === '4teams') {
    ctx.fillStyle = '#00803e';
    ctx.beginPath();
    ctx.fillRect(0,0,1920,1080);
    }
    ctx.restore();
    }
}
function fillPurple(flag) {
    if (flag == 1) {
    if (player.dead) return;
    ctx.save();
    ctx.globalAlpha = 0.12;
    if (player.gamemode === '4teams') {
    ctx.fillStyle = '#644280';
    ctx.beginPath();
    ctx.fillRect(0,0,1920,1080);
    }
    ctx.restore();
    }
}
function drawZones(scale, notFullScreen) {
    if (player.dead) return;
    ctx.save();
    ctx.globalAlpha = 0.12;
    let radius = 52;
    let width = 169;
    let compensation = notFullScreen * (width-2);

    if (player.gamemode === '4teams') {

        //blue
        ctx.fillStyle = '#006480';
        ctx.beginPath();
        ctx.arc(1920-(1920-1728)*scale, 1080-(1080-888)*scale-compensation, radius*scale, 0 * Math.PI, 1/2 * Math.PI);
        ctx.fill();
        ctx.beginPath();
        ctx.moveTo(1920-(1920-1728)*scale, 1080-(1080-888)*scale-compensation);
        ctx.lineTo(1920-(1920-1728)*scale+radius*scale, 1080-(1080-888)*scale-compensation);
        ctx.lineTo(1920-(1920-1728)*scale, 1080-(1080-888)*scale+radius*scale-compensation);
        ctx.fill();

        //purple
        ctx.fillStyle = '#644280';
        ctx.beginPath();
        ctx.arc(1920-(1920-1728)*scale+width*scale, 1080-(1080-888)*scale-compensation, radius*scale, 1/2 * Math.PI, Math.PI);
        ctx.fill();
        ctx.beginPath();
        ctx.moveTo(1920-(1920-1728)*scale+width*scale, 1080-(1080-888)*scale-compensation);
        ctx.lineTo(1920-(1920-1728)*scale+radius*scale+width*scale-2*radius*scale, 1080-(1080-888)*scale-compensation);
        ctx.lineTo(1920-(1920-1728)*scale+width*scale, 1080-(1080-888)*scale+radius*scale-compensation);
        ctx.fill();

        //green
        ctx.fillStyle = '#00803e';
        ctx.beginPath();
        ctx.arc(1920-(1920-1728)*scale, 1080-(1080-888)*scale+width*scale-compensation, radius*scale, 3/2 * Math.PI, 2 * Math.PI);
        ctx.fill()
        ctx.beginPath();
        ctx.moveTo(1920-(1920-1728)*scale, 1080-(1080-888)*scale+width*scale-compensation);
        ctx.lineTo(1920-(1920-1728)*scale+radius*scale, 1080-(1080-888)*scale+width*scale-compensation);
        ctx.lineTo(1920-(1920-1728)*scale, 1080-(1080-888)*scale+radius*scale+width*scale-2*radius*scale-compensation);
        ctx.fill();

        //red
        ctx.fillStyle = '#963033';
        ctx.beginPath();
        ctx.arc(1920-(1920-1728)*scale+width*scale, 1080-(1080-888)*scale+width*scale-compensation, radius*scale, Math.PI, 3/2 * Math.PI);
        ctx.fill();
        ctx.beginPath();
        ctx.moveTo(1920-(1920-1728)*scale+width*scale, 1080-(1080-888)*scale+width*scale-compensation);
        ctx.lineTo(1920-(1920-1728)*scale+radius*scale+width*scale-2*radius*scale, 1080-(1080-888)*scale+width*scale-compensation);
        ctx.lineTo(1920-(1920-1728)*scale+width*scale, 1080-(1080-888)*scale+radius*scale+width*scale-2*radius*scale-compensation);
        ctx.fill();

    } else if (player.gamemode === 'teams') {
        let radius2 = 40;
        //blue
        ctx.fillStyle = '#006480';
        ctx.fillRect(1920-(1920-1728)*scale, 1080-(1080-890)*scale-compensation, radius2*scale, 170*scale);

        //red
        ctx.fillStyle = '#963033';
        ctx.fillRect(1920-(1920-1728)*scale+124*scale, 1080-(1080-890)*scale-compensation, radius2*scale, 170*scale);
    }
    ctx.restore();
}
class Gui {
    constructor(title) {
        this._buttons = [];
    }
}
class Minimap {
    constructor() {
        this._minimapWidth;
        this._minimapHeight;
        this._x00;
        this._y00;
        this._pointX;
        this._pointY;
        this._pointX_previous;
        this._pointY_previous;
        this._viewportWidth;
        this._viewportHeight;
        this._fov;

        this._minimapHook();
        this._arrowHook();
        this._viewportHook();
        this._fovHook();}
    get x() {
        return this._pointX ? (this._pointX - this._x00) / this._minimapWidth : 0;
    }
    get y() {
        return this._pointY ? (this._pointY - this._y00) / this._minimapHeight : 0;
    }
    get x_previous() {
        return this._pointX_previous ? (this._pointX_previous - this._x00) / this._minimapWidth : 0;
    }
    get y_previous() {
        return this._pointY_previous ? (this._pointY_previous - this._y00) / this._minimapHeight : 0;
    }
    get scale() {
        return {
            x: this._viewportWidth / this._minimapWidth,
            y: this._viewportHeight / this._minimapHeight,
        };
    }
    get fov() {
        return this._fov;
    }

    _minimapHook() {
        let setTransformArgs;

        const onsetTransform = (args) => {
            if (args[0] === args[3]) setTransformArgs = args;
        };
        const onstrokeRect = () => {
            if (setTransformArgs) {
                this._minimapWidth = setTransformArgs[0];
                this._minimapHeight = setTransformArgs[3];
                this._x00 = setTransformArgs[4];
                this._y00 = setTransformArgs[5];
                setTransformArgs = undefined;
            }
        };
        this._ctxHook('setTransform', onsetTransform);
        this._ctxHook('strokeRect', onstrokeRect);
    }
    _arrowHook() {
        let index = 0;
        const stack = Array(4);

        let pointA;
        let pointB;
        let pointC;

        const calculatePos = () => {
            const side1 = Math.floor(
                Math.sqrt(Math.pow(pointA[0] - pointB[0], 2) + Math.pow(pointA[1] - pointB[1], 2))
            );
            const side2 = Math.floor(
                Math.sqrt(Math.pow(pointA[0] - pointC[0], 2) + Math.pow(pointA[1] - pointC[1], 2))
            );
            const side3 = Math.floor(
                Math.sqrt(Math.pow(pointB[0] - pointC[0], 2) + Math.pow(pointB[1] - pointC[1], 2))
            );
            if (side1 == side2 && side2 == side3) return;

            this._pointX_previous = this._pointX;
            this._pointY_previous = this._pointY;

            this._pointX = (pointA[0] + pointB[0] + pointC[0]) / 3;
            this._pointY = (pointA[1] + pointB[1] + pointC[1]) / 3;
        };
        const onbeginPath = () => {
            index = 0;
            stack[index++] = 0;
        };
        const onmoveTo = (args) => {
            if (index === 1 && stack[index - 1] === 0) {
                stack[index++] = 1;
                pointA = args;
                return;
            }
            index = 0;
        };
        const onlineTo = (args) => {
            if (index === 2 && stack[index - 1] === 1) {
                stack[index++] = 2;
                pointB = args;
                return;
            }
            if (index === 3 && stack[index - 1] === 2) {
                stack[index++] = 2;
                pointC = args;
                return;
            }
            index = 0;
        };
        const onfill = () => {
            if (index === 4 && stack[index - 1] === 2) {
                calculatePos();
                return;
            }
            index = 0;
        };

        this._ctxHook('beginPath', onbeginPath);
        this._ctxHook('moveTo', onmoveTo);
        this._ctxHook('lineTo', onlineTo);
        this._ctxHook('fill', onfill);
    }
    _viewportHook() {
        let setTransformArgs;

        const onsetTransform = (args) => {
            if ((args[0] / args[3]).toFixed(4) !== (unsafeWindow.innerWidth / unsafeWindow.innerHeight).toFixed(4)) return;
            if (args[0] >= unsafeWindow.innerWidth && args[3] >= unsafeWindow.innerHeight) return;
            setTransformArgs = args;
        };
        const onfillRect = () => {
            if (setTransformArgs) {
                unsafeWindow.input.set_convar('ren_minimap_viewport', true);
                this._viewportWidth = setTransformArgs[0];
                this._viewportHeight = setTransformArgs[3];
                setTransformArgs = undefined;
            }
        };

        this._ctxHook('setTransform', onsetTransform);
        this._ctxHook('fillRect', onfillRect);

        setInterval(() => {
            unsafeWindow.input.set_convar('ren_minimap_viewport', true);
        }, 1000);
    }
    _fovHook() {
        let solid_background = false;
        setTimeout(() => {
            solid_background = unsafeWindow.input.get_convar('ren_solid_background') === 'true' ? true : false;
        }, 1000);

        const calculateFov = (fov) => {
            this._fov = fov * 10;
        };
        function onstroke() {
            if (this.fillStyle === '#cdcdcd') {
                if (solid_background) unsafeWindow.input.set_convar('ren_solid_background', true);
                calculateFov(this.globalAlpha);
            }
        }

        this._ctxHook('stroke', onstroke);

        setInterval(() => {
            if (solid_background) unsafeWindow.input.set_convar('ren_solid_background', false);
        }, 10000);
    }
    _ctxHook(method, hook) {
        const target = window.CanvasRenderingContext2D.prototype;
        target[method] = new Proxy(target[method], {
            apply(target, thisArg, args) {
                args = hook.call(thisArg, args) || args;
                return target.apply(thisArg, args);
            },
        });
    }
}

class Vector {}

class Arena {
    static get BLOCKSIZE() {
        return 50;
    }
}
class Player {
    constructor() {
        this._minimap = new Minimap();
        this._dead = true;

        //Dead Listener
        new MutationObserver((args) => {
            this._dead = args[0].target.style.display === 'block';
            if (this.ondead && this._dead) this.ondead();
        }).observe(document.getElementById('a'), { attributes: true });
    }

    get dead() {
        return this._dead;
    }

    get gamemode() {
        return unsafeWindow.localStorage.gamemode;
    }

}


class Chat {
    constructor(player) {
        this._player = player;
        this._inputBox = document.body.appendChild(document.createElement('div'));
        this._hookonkeydown();
        this._hookAnimationFrame();
    }

    _hookonkeydown() {
        const _this = this;
        unsafeWindow.onkeydown = new Proxy(unsafeWindow.onkeydown, {
        });
    }
    _hookAnimationFrame() {
        const _this = this;
        unsafeWindow.requestAnimationFrame = new Proxy(unsafeWindow.requestAnimationFrame, {
        });
    }
}

const player = new Player();
const arena = new Arena();
const chat = new Chat(player);
const minimap = new Minimap();
const radius = 52;
const width = 169;
var a,fj,fk,fl,fm,tj,tk = 0;
var scale = d/175
var x = minimap._pointX;
var y = minimap._pointY;
var d = minimap._minimapWidth;
var compensation = a * (width-2);
//setup canvas
const ctx = document.getElementById('canvas').getContext('2d');
// run main Loop

unsafeWindow.requestAnimationFrame = new Proxy(unsafeWindow.requestAnimationFrame, {
    apply: function (target, thisArg, args) {
        //4 teams
        //Blue
        setInterval(() => {
            x = minimap._pointX;
            scale = d / 175
            y = minimap._pointY;
            compensation = a * (width-2);
            if(Math.pow(1920-(1920-1728)*scale-x,2) + Math.pow(1080-(1080-888)*scale-compensation-y,2)<Math.pow(radius*scale, 2)) {
            fj = 1;}
            else {fj = 0;}

        }, 2000);
        //Purple
        setInterval(() => {
            x = minimap._pointX;
            scale = d / 175
            y = minimap._pointY;
            compensation = a * (width-2);
            if(Math.pow(1920-(1920-1728)*scale+width*scale-x,2) + Math.pow(1080-(1080-888)*scale-compensation-y,2)<Math.pow(radius*scale, 2)) {
            fk = 1;}
            else {fk = 0;}

        }, 2000);
        //Green
        setInterval(() => {
            x = minimap._pointX;
            scale = d / 175
            y = minimap._pointY;
            compensation = a * (width-2);
            if(Math.pow(1920-(1920-1728)*scale-x,2) + Math.pow(1080-(1080-888)*scale+width*scale-compensation-y,2)<Math.pow(radius*scale, 2)) {
            fl = 1;}
            else {fl = 0;}

        }, 2000);
        //Red
        setInterval(() => {
            x = minimap._pointX;
            scale = d / 175
            y = minimap._pointY;
            compensation = a * (width-2);
            if(Math.pow(1920-(1920-1728)*scale+width*scale-x,2) + Math.pow(1080-(1080-888)*scale+width*scale-compensation-y,2)<Math.pow(radius*scale, 2)) {
            fm = 1;}
            else {fm = 0;}

        }, 2000);
        //2 teams
        //Blue
        setInterval(() => {
            x = minimap._pointX;
            scale = d / 175
            y = minimap._pointY;
            compensation = a * (width-2);
            if(1920-(1920-1728)*scale+d*scale<x) {
            tj = 1;}
            else {tj = 0;}

        }, 2000);
        //Red
        setInterval(() => {
            x = minimap._pointX;
            scale = d / 175
            y = minimap._pointY;
            compensation = a * (width-2);
            if(1920-(1920-1728)*scale+radius*scale>x) {
            tk = 1;}
            else {tk = 0;}

        }, 2000);

        //Old
        setInterval(() => {
            if(window.innerHeight == screen.height) {
            a = 0;} else {a = 1;}}, 2000);
        setInterval(() => {d = minimap._minimapWidth}, 2000);
        // drawZones(d / 175, a);
        fillBlue(fj);
        fillPurple(fk);
        fillGreen(fl);
        fillRed(fm);
        fillBlue2(tj);
        fillBlue2(tk);

        setTimeout(() => Reflect.apply(target, thisArg, args), 0);
    },
});