2k09__ Bot Mode V-0.1

-

// ==UserScript==
// @name         2k09__ Bot Mode V-0.1
// @namespace    -
// @version      0.1
// @description  -
// @author       2k09__
// @match        https://sploop.io/
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict'

 alert('||~~ Commands: ||| !md -ab = AddBot ||| !md -rb ~~||');
!~function(
$ = document.querySelector.bind(document),
 botID = 0,
 bots = [],
 isBot = (window.location !== window.parent.location),
 playerID, playerX, playerY,
 ownerX, ownerY,
 touchStart = {x: 0, y: 0},
 keys = {}, weaponKey = "1"
) {

    class Sploop {
        static newKeyEvent(type) {
            return function (eventObj) {
                const { key, code } = eventObj;
                window.KeyboardEvent = Object;
                window.getEvents(type)[type == "keydown" ? 1 : 0].listener({key: key, code: code, isTrusted: 1, target: document.body, preventDefault: () => null});
                window.KeyboardEvent = KeyBoardEvent;
            };
        }
        static key = {
            down: this.newKeyEvent("keydown"),
            up: this.newKeyEvent("keyup"),
            press(eventObj) {
                Sploop.newKeyEvent("keydown")(eventObj);
                Sploop.newKeyEvent("keyup")(eventObj);
            }
        };
        static foodPlace() {
            //alert("QQQ")
            this.key.press({code: "KeyQ"});
            this.key.press({code: "Space"});
            this.key.press({key: weaponKey});
        }
        static spikePlace() {
            //alert("QQQ")
            this.key.press({code: "KeyR"});
            this.key.press({code: "Space"});
            this.key.press({key: weaponKey});
        }
        static trapPlace() {
            //alert("QQQ")
            this.key.press({code: "KeyF"});
            this.key.press({code: "Space"});
            this.key.press({key: weaponKey});
        }
        static newTouchEvent = function(type) {
            return function (eventObj) {
                const { x, y, id } = eventObj;
                $("#game-canvas").getEvents(type)[0].listener({changedTouches: [{identifier: id, pageX: x, pageY: y}], preventDefault: () => null, stopPropagation: () => null});
            };
        };
        static touch = {
            start: this.newTouchEvent("touchstart"),
            move: this.newTouchEvent("touchmove"),
            end: this.newTouchEvent("touchend")
        }

        static spawn(name) {
            $("#nickname").value = name;
            $("#play").getEvents("click")[0].listener();
            $("#nickname").value = localStorage.getItem("nickname")||"";
        };

        static changeServer(serverID) {
            $("#server-select").options[0].setAttribute("region", serverID)
            $("#server-select").selectedIndex = 0;
            $("#server-select").getEvents("change")[0].listener();
        };
    };
    window.Sploop = Sploop;


    window.addEventListener("load", ()=> (Object.keys(window.getEvents()).length === 0) && (window.onbeforeunload && (window.onbeforeunload = null), window.location.reload()));

    WebSocket.prototype._send = WebSocket.prototype.send;
    WebSocket.prototype.send = function() {
        if(!isBot) {
            for(let bot of bots) {
                /*
				ko: 11, //somethingOnBegin
				Uo: 6, //moveByBitmask
				yo: 13, //changeAIM
				Eo: 2, //selectItemByID
				Bo: 19, //attack
				Co: 18, //stopAttack
				zo: 10, //spawn
				Do: 20, //scytheUpgrade
				xo: 0, //selectItemByType
				Lo: 5,//equipHat
				Fo: 7, //sendChat
				Oo: 14, //upgrade
				jo: 12, //noting
				So: 3, //pingStuff
				Po: 23, //autoHit
				Vo: 1, //moveToDir
				No: 15, //removeMoveDir
				Ho: 9, //touchStart
				Wo: 4, //noting
				Go: 8, //touchEnd
				Qo: 24, //leaveClan
				Yo: 21, //joinInClan
				qo: 17, //acceptDecline
				Zo: 25, //kick
				Xo: 22, //createClan
				*/
                if(![22, 25, 17, 3, 10, 11].includes(arguments[0][0])) (bot.contentWindow.ws || this)._send(...arguments);
            }
        }
        this._send(...arguments);
        if(this.HOOKED) return;
        this.HOOKED = true;
        window.ws = this;
        var botSpwned = false;
        this.addEventListener("message", (msg)=>{
            const d = ("string" != typeof msg.data ? new Uint8Array(msg.data) : JSON.parse(msg.data))
            if(d[0] == 35) {
                if(isBot && !playerID) Sploop.touch.start({id: 1000, x: innerWidth/4, y: innerHeight/2})
                playerID = d[1];
            }
            if(d[0] == 20) {
                for(let i = 1; i < d.byteLength; i += 18) {
                    const id = d[i + 2] | d[i + 3] << 8;
                    const x = d[i + 4] | d[i + 5] << 8;
                    const y = d[i + 6] | d[i + 7] << 8;
                    if(playerID == id) {
                        playerX = x;
                        playerY = y;
                        if(!isBot) {
                            for(let bot of bots) bot.isLoaded && bot.contentWindow.updateOwnerPosition(x, y);
                        }
                    }
                }
                if(isBot) {
                    !botSpwned && (Sploop.spawn( "2k09__Bot", (botSpwned=1)))
                }
            }
        });
        if(!isBot) {
            this.rg = this.url.split("//")[1].split(".sploop")[0].toLocaleUpperCase();
            for(let bot of bots) {
                bot.contentWindow.changeServer(this.rg);
            }
        }
    }

    isBot && (
        window.onload = ()=> initBot(),
        Object.defineProperty(Object.prototype, "region", {
            get: () => window.ownerServer,
            set: () => true,
            configurable: true
        })
    );
    function initBot() {

        window.changeServer = function(serverID) {
            Sploop.changeServer(serverID);
        };

        window.updateOwnerPosition = function(x, y) {
            ownerX = x;
            ownerY = y;
        }

        setInterval(()=>{
            const angle = Math.atan2(ownerY - playerY, ownerX - playerX);
            if (Math.sqrt(Math.pow(((playerX - ownerX)), 2) + Math.pow(((playerY - ownerY)), 2)) > 185) {
                Sploop.touch.start({id: 1000, x: innerWidth/4, y: innerHeight/2})
                Sploop.touch.move({id: 1000, x: innerWidth/4+50*Math.cos(angle), y: innerHeight/2+50*Math.sin(angle)});
            }else{
                Sploop.touch.end({id: 1000, x: innerWidth/4, y: innerHeight/2})
            }
        });

        const onDeathCallback = function(changedList) {
            const display = changedList[0].target.style.display;
            if(display == "flex") Sploop.spawn("2k09__Bot");
        };
        const deathChecker = new MutationObserver(onDeathCallback);
        deathChecker.observe($("#homepage"), {attributes: true, attributeFilter: ["style"]});
    };




    !isBot && (window.onload = ()=> initClient());
    function initClient() {

        function createBot(id) {
            const div = document.createElement("div");
            div.innerHTML = `<iframe id="bot${id}" src="https://sploop.io" width="300" height="600" frameborder="0" scrolling="no" allowfullscreen="true" style="width: 300px; height: 200px; margin: 0; padding: 0; border: 0; position: absolute; top: 0; left: 0"></iframe>`;
            const iframe = div.firstChild;
            document.body.append(iframe);
            iframe.contentWindow.ownerServer = $("#server-select").selectedOptions[0].getAttribute("region");
            iframe.onload = ()=>{iframe.isLoaded = true};
            return iframe;
        };
        let placementkeys = {
            spike: false,
            trap: false
        };
        setInterval(() => {
        if(placementkeys.spike) Sploop.spikePlace()
        if(placementkeys.trap) Sploop.trapPlace()
        }, 20);
        window.addEventListener("keydown", function(e) {
            if(e.code == "KeyV") placementkeys.spike = true;
            if(e.code == "KeyF") placementkeys.trap = true;
            if(!keys[e.keyCode]) {
                keys[e.keyCode] = 1;
                if(e.code == "Enter" && window.chat && window.chat.value != '') {
                    if(window.chat.value == "!md -ab") bots.push(createBot(bots.length))
                    if(window.chat.value == "!md -rb") {
                        for(let bID in bots) $(`#bot${bID}`).remove()
                        bots.length = 0
                    }
                    if(window.chat.value.split(" ")[0] == "/close") {
                        const id = window.chat.value.split(" ")[1] - 1
                        if(!bots[id]) return;
                        $(`#bot${id}`).remove()
                        for(let bID in bots) {
                            if(bID > id && bID != id) $(`#bot${bID}`).id = `bot${bID-1}`
						}
                        bots.splice(id, 1)
                    }
                }
            }
        });
        document.addEventListener("keyup", (e) => {
            if(e.code == "KeyV") placementkeys.spike = false;
            if(e.code == "KeyF") placementkeys.trap = false;
            if(keys[e.keyCode]) {
                keys[e.keyCode] = 0;
            };
        });
    };

    (function autoHeal() {
        let allies = [], hp;
        const { fillRect, clearRect } = CanvasRenderingContext2D.prototype;
        CanvasRenderingContext2D.prototype.clearRect = function () {
            if (this.canvas.id === "game-canvas") allies = [];
            return clearRect.apply(this, arguments);
        };

        CanvasRenderingContext2D.prototype.fillRect = function (x, y, width, height) {
            if(this.fillStyle == "#a4cc4f") {
                allies.push({x: x + 45, y: y - 70, hp: Math.round((width / 95) * 100)});
                if(allies.length == 1) hp = allies[0].hp;
            }
            fillRect.apply(this, arguments);
        };

        window.addEventListener("keydown", function(e) {
            if(["1", "2"].includes(e.key)) weaponKey = e.key;
        });

        function ah() {
            function getDelay(hp) {
                var delay = 200;
                if(hp < 90) delay = 130;
                if(hp < 74) delay = 60;
                if(hp < 36) delay = 45;
                return delay;
            };
            if(hp < 100) Sploop.foodPlace();
            setTimeout(()=>{ah()}, getDelay(hp));
        }
        ah();
    })();

    (function hookEvents() {
        _setTimeout = setTimeout; console._log = console.log; KeyBoardEvent = KeyboardEvent;
        EventTarget.prototype._addEventListener = EventTarget.prototype.addEventListener;
        EventTarget.prototype.addEventListener = function(event, handler, c) {
            if (c==undefined) c=false;
            this._addEventListener(event,handler,c);
            if (!this.eventListenerList) this.eventListenerList = {};
            if (!this.eventListenerList[event]) this.eventListenerList[event] = [];
            this.eventListenerList[event].push({listener:handler,options:c});
        };
        EventTarget.prototype.getEvents = function(event) {
            if (!this.eventListenerList) this.eventListenerList = {};
            if (event==undefined) return this.eventListenerList;
            return this.eventListenerList[event];
        };

        let array = [HTMLElement.prototype, window, document];
        for(let obj of array) {
            for(let prop in obj) {
                if(!prop.startsWith("on")) continue;
                Object.defineProperty(obj, prop, {
                    get() {
                        return this["_" + prop];
                    },
                    set(value) {
                        this["_" + prop] = value;
                        if(prop == "onbeforeunload") return value;
                        this.addEventListener(prop.split("on")[1], value);
                    }
                });
            }
        }
    })();
}()
})();