bruh

practice with websocket

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name bruh
// @namespace Simple Mod
// @match *://*/*
// @grant none
// @version 1.0
// @author keypressed & z-r
// @description practice with websocket
// @license MIT
// ==/UserScript==


var killCount = 0;
var lastSpawnTime = Date.now();
var spawnChat = false;
var killChat = false;
var autoRespawn = false;
var spawnContent = "spawn↠[player]";
var killChatTextValue = "kill↠[playerkilled] ([kills])";
var showID = false;
var nick = document.getElementById("nickname");
const play = document.getElementById("play");
var autoSelect = false;
var buildingInfo = false;
var logItem = false;
var logData = false;
var autoheal = false;
var millWarning = false;
var maxMills = false;
let millMessage = "replace your mill(s)!";
//automatically set nickname
nick.value = "sploop.io";

const menu = document.createElement("div");
document.body.appendChild(menu);
menu.style.position = "absolute";
menu.style.top = "10px";
menu.style.left = "10px";
menu.style.width = "400px";
menu.style.height = "auto";
menu.style.border = "2px solid black";
menu.style.borderRadius = "10px";
menu.style.backgroundColor = "lightpink";
menu.style.opacity = "0.9";
menu.style.padding = "8px";

function toggleMenu() {
    if (menu.style.display === 'none') {
        menu.style.display = 'block';
    } else {
        menu.style.display = 'none';
    }
}

document.addEventListener('keydown', function (event) {
    if (event.key === 'Escape') {
        toggleMenu();
    }
});
const header = document.createElement("h1");
header.textContent = "Simple Mod v1.0.1";
menu.appendChild(header);
header.style.margin = "5px";

const division = document.createElement("hr");
menu.appendChild(division);

const label = document.createElement("label");
label.textContent = "Send chat on players spawning";
menu.appendChild(label);
label.style.margin = "5px";

const checkbox = document.createElement("input");
checkbox.type = "checkbox";
menu.appendChild(checkbox);
checkbox.checked = false;

const lineBreak = document.createElement("br");
menu.appendChild(lineBreak);


const spawnChatInputLabel = document.createElement("label");
spawnChatInputLabel.textContent = "What text to say when player spawns: ";
menu.appendChild(spawnChatInputLabel);
spawnChatInputLabel.style.margin = "5px";


const lineBreak2 = document.createElement("br");
menu.appendChild(lineBreak2);

const spawnChatInputText = document.createElement("input");
spawnChatInputText.value = spawnContent;
menu.appendChild(spawnChatInputText);
spawnChatInputText.style.margin = "5px";
spawnChatInputText.style.width = "350px";

const lineBreak3 = document.createElement("br");
menu.appendChild(lineBreak3);

const showIDSLabel = document.createElement("label");
showIDSLabel.textContent = "Show IDS in the spawn text";
showIDSLabel.style.margin = "5px";
menu.appendChild(showIDSLabel);

const IDCheckbox = document.createElement("input");
IDCheckbox.type = "checkbox";
IDCheckbox.checked = false;
menu.appendChild(IDCheckbox);

const firstHR = document.createElement("hr");
menu.appendChild(firstHR);

const killChatToggleLabel = document.createElement("label");
killChatToggleLabel.textContent = "Send killchat";
killChatToggleLabel.style.margin = "5px";
menu.appendChild(killChatToggleLabel);

const killChatToggle = document.createElement("input");
killChatToggle.type = "checkbox";
killChatToggle.checked = false;
menu.appendChild(killChatToggle);

const lineBreak4 = document.createElement("br");
menu.appendChild(lineBreak4);

const killChatLabel = document.createElement("label");
killChatLabel.textContent = "Text sent on a kill";
menu.appendChild(killChatLabel);
killChatLabel.style.margin = "5px";

const killChatText = document.createElement("input");
killChatText.type = "text";
killChatText.value = killChatTextValue;
menu.appendChild(killChatText);

const secondHR = document.createElement("hr");
menu.appendChild(secondHR);

const autoRespawnLabel = document.createElement("label");
autoRespawnLabel.textContent = "Auto-respawn";
menu.appendChild(autoRespawnLabel);
autoRespawnLabel.style.margin = "5px";

const autoRespawnToggle = document.createElement("input");
autoRespawnToggle.type = "checkbox";
autoRespawnToggle.checked = false;
menu.appendChild(autoRespawnToggle);

const lineBreak5 = document.createElement("br");
menu.appendChild(lineBreak5);

const autoRespawnNameLabel = document.createElement("label");
autoRespawnNameLabel.textContent = "Auto-respawn name: ";
menu.appendChild(autoRespawnNameLabel);
autoRespawnNameLabel.style.margin = "5px";

const autoRespawnName = document.createElement("input");
autoRespawnName.type = "text";
autoRespawnName.value = nick.value;
menu.appendChild(autoRespawnName);

const thirdHR = document.createElement("hr");
menu.appendChild(thirdHR);

const autoSelectLabel = document.createElement("label");
autoSelectLabel.textContent = "Auto Select KTH";
menu.appendChild(autoSelectLabel);
autoSelectLabel.style.margin = "5px";

const sendWeapons = document.createElement("input");
sendWeapons.type = "checkbox";
sendWeapons.checked = false;
menu.appendChild(sendWeapons);

const fourthHR = document.createElement("hr");
menu.appendChild(fourthHR);

const buildingInfoLabel = document.createElement("label");
buildingInfoLabel.textContent = "Show number of buildings";
menu.appendChild(buildingInfoLabel);
buildingInfoLabel.style.margin = "5px";

const buildingInfoToggle = document.createElement("input");
buildingInfoToggle.type = "checkbox";
buildingInfoToggle.checked = false;
menu.appendChild(buildingInfoToggle);



const buildInfoContainer = document.createElement("div");
buildInfoContainer.style.width = "auto";
buildInfoContainer.style.height = "auto";
buildInfoContainer.style.border = "2px solid black";
buildInfoContainer.style.borderRadius = "10px";
buildInfoContainer.style.backgroundColor = "salmon";
buildInfoContainer.style.opacity = "0.8";
buildInfoContainer.style.padding = "8px";
buildInfoContainer.style.display = "none";
menu.appendChild(buildInfoContainer);

const walls = document.createElement("label");
walls.textContent = "Walls: 0/100";
const line = document.createElement("br");
const mills = document.createElement("label");
mills.textContent = "Mills: 0/8";
const line2 = document.createElement("br");
const spikes = document.createElement("label");
spikes.textContent = "Spikes: 0/30";
const line3 = document.createElement("br");
const platforms = document.createElement("label");
platforms.textContent = "Platforms: 0/32";
const line4 = document.createElement("br");
const cosy = document.createElement("label");
cosy.textContent = "Cosy bed: 0/1";
const line5 = document.createElement("br");
const trap = document.createElement("label");
trap.textContent = "Trap/boosts: 0/12";
buildInfoContainer.append(walls, line, mills, line2, spikes, line3, platforms, line4, cosy, line5, trap);

const lineBreak6 = document.createElement("br");
menu.appendChild(lineBreak6);

const warnLabel = document.createElement("label");
warnLabel.textContent = "Send warning on mills being broken";
menu.appendChild(warnLabel);
warnLabel.style.margin = "5px";

const warnToggle = document.createElement("input");
warnToggle.type = "checkbox";
warnToggle.checked = false;
menu.appendChild(warnToggle);

const fifthHR = document.createElement("hr");
menu.appendChild(fifthHR);
const lineBreak7 = document.createElement("br");
menu.appendChild(lineBreak7);

const autohealLabel = document.createElement("label");
autohealLabel.textContent = "Autoheal";
menu.appendChild(autohealLabel);
autohealLabel.style.margin = "5px";

const autohealToggle = document.createElement("input");
autohealToggle.type = "checkbox";
autohealToggle.checked = false;
menu.appendChild(autohealToggle);

const lineBreak8 = document.createElement("br");
menu.appendChild(lineBreak8);

const healthLabel = document.createElement("label");
healthLabel.textContent = "Health: none";
menu.appendChild(healthLabel);
healthLabel.style.margin = "5px";

const ninthHR = document.createElement("hr");
menu.appendChild(ninthHR);

const mainDebugToggle = document.createElement("label");
mainDebugToggle.textContent = "Show debug options";
menu.appendChild(mainDebugToggle);
mainDebugToggle.style.margin = "5px";

const mainDebugCB = document.createElement("input");
mainDebugCB.type = "checkbox";
mainDebugCB.checked = false;
menu.appendChild(mainDebugCB);

const debugDiv = document.createElement("div");
menu.appendChild(debugDiv);
debugDiv.style.margin = "5px";
debugDiv.style.display = "none";

const lineBreak10 = document.createElement("br");
debugDiv.appendChild(lineBreak10);

const debugInfo = document.createElement("label");
debugInfo.textContent = "Log item to custom console";
debugDiv.appendChild(debugInfo);
debugInfo.style.margin = "5px";

const debugItem = document.createElement("input");
debugItem.type = "checkbox";
debugItem.checked = false;
debugDiv.appendChild(debugItem);


const lineBreak12 = document.createElement("br");
debugDiv.appendChild(lineBreak12);

const debugData = document.createElement("label");
debugData.textContent = "Log data to custom console";
debugDiv.appendChild(debugData);
debugData.style.margin = "5px";

const debug2Toggle = document.createElement("input");
debug2Toggle.type = "checkbox";
debug2Toggle.checked = false;
debugDiv.appendChild(debug2Toggle);

IDCheckbox.addEventListener('change', function () {
    if (this.checked) {
        showID = true;
    } else {
        showID = false;
    }
});

checkbox.addEventListener('change', function () {
    if (this.checked) {
        spawnChat = true;
    } else {
        spawnChat = false;
    }
});

killChatToggle.addEventListener('change', function () {
    if (this.checked) {
        killChat = true;
    } else {
        killChat = false;
    }
});

autoRespawnToggle.addEventListener('change', function () {
    if (this.checked) {
        autoRespawn = true;
    } else {
        autoRespawn = false;
    }
});

sendWeapons.addEventListener('change', function () {
    if (this.checked) {
        autoSelect = true;
    } else {
        autoSelect = false;
    }
});

debugItem.addEventListener('change', function () {
    if (this.checked) {
        logItem = true;
    } else {
        logItem = false;
    }
});

debug2Toggle.addEventListener('change', function () {
    if (this.checked) {
        logData = true;
    } else {
        logData = false;
    }
});

mainDebugCB.addEventListener('change', function () {
    if (this.checked) {
        debugDiv.style.display = "block";
    } else {
        debugDiv.style.display = "none";
    }
});

autohealToggle.addEventListener('change', function () {
    if (this.checked) {
        autoheal = true;
    } else {
        autoheal = false;
    }
});

warnToggle.addEventListener('change', function () {
    if (this.checked) {
        millWarning = true;
    } else {
        millWarning = false;
    }
});

buildingInfoToggle.addEventListener('change', function () {
    if (this.checked) {
        buildingInfo = true;
        buildInfoContainer.style.display = "block";
    } else {
        buildingInfo = false;
        buildInfoContainer.style.display = "none";
    }
});
function logToCustomConsole(message) {
    var customConsole = document.getElementById('custom-console');
    var newLine = document.createElement('div');
    newLine.textContent = message;
    customConsole.appendChild(newLine);

    if (customConsole.scrollTop + customConsole.clientHeight >= customConsole.scrollHeight - 20) {
        customConsole.scrollTop = customConsole.scrollHeight;
    }
}

var millWarningDiv = document.createElement("div");
                  document.body.appendChild(millWarningDiv);
                  millWarningDiv.style.position = "absolute";
                  millWarningDiv.style.top = "10px";
                  millWarningDiv.style.left = "900px";
                  millWarningDiv.style.height = "50px";
                  millWarningDiv.style.position = "auto";
                  millWarningDiv.style.border = "2px solid black";
                  millWarningDiv.style.textAlign = "center";
                  millWarningDiv.style.borderRadius = "5px";
                  millWarningDiv.style.backgroundColor = "salmon";
                  millWarningDiv.style.opacity = "0.9";
                  millWarningDiv.textContent = "Replace your mills!";
millWarningDiv.style.display = "none";



var customConsoleElement = document.createElement('div');
customConsoleElement.id = 'custom-console';
debugDiv.appendChild(customConsoleElement);
customConsoleElement.style.width = "auto";
customConsoleElement.style.height = "150px";
customConsoleElement.style.border = "2px solid black";
/*customConsoleElement.style.position = "absolute";
customConsoleElement.style.top = "10px";
customConsoleElement.style.left = "500px";*/
customConsoleElement.style.overflow = "auto";
let lastPacket = 0;

WebSocket.prototype.lastSend = WebSocket.prototype.send;
WebSocket.prototype.send = function (a) {
    this.lastSend(a);
    this.addEventListener("message", (msg) => {
        try {
            const data = typeof msg.data == "string" ? JSON.parse(msg.data) : new Uint8Array(msg.data);
            const item = data[0];

                let wallAmt = data[4];
                let spikeAmt = data[5];
                let millAmt = data[6];
                let trapAmt = data[8];
                let platformAmt = data[9];
                let bedAmt = data[10];
            if (item == 20 && autoheal) {
               healthLabel.textContent = "Health: " + data[13] / 255 * 100;
            }
            if (item != 20 && item != lastPacket && logItem) {
                logToCustomConsole(item);
                lastPacket = item;
            }
            if (item != 20 && item != lastPacket && logData) {
                logToCustomConsole(data);
                lastPacket = item;
            }
            if (item == 36 && (Date.now() - lastSpawnTime > 50)){
                if(millAmt === 8){
                  maxMills = true;
                  millWarningDiv.style.display = "none";
                }
                if(maxMills && millWarning && millAmt<8){
                  millWarningDiv.style.display = "block";
                  logToCustomConsole(millMessage);
                }
                lastSpawnTime = Date.now();
            }
            if (item == 36 && (Date.now() - lastSpawnTime > 50)) {
                walls.textContent = "Walls: " + wallAmt + "/100";
                spikes.textContent = "Spikes: " + spikeAmt + "/30";
                mills.textContent = "Mills: " + millAmt + "/8";
                platforms.textContent = "Platforms/roof: " + platformAmt + "/32";
                trap.textContent = "Trap/boosts: " + trapAmt + "/12";
                cosy.textContent = "Cosy bed: " + bedAmt + "/1";
                lastSpawnTime = Date.now();
                //index 0 = packet type
                //index 1 = unknown
                //index 2 = unknown
                //index 3 = unknown
                //index 4 = wall
                //index 5 = spike
                //index 6 = mill
                //index 7 = bush/sapling/stone
                //index 8 = trap/boost
                //index 9 = roof/platform
                //index 10 = cosy bed
                //index 11 = unknown
            }
            if (item == 14 && autoSelect && (Date.now() - lastSpawnTime > 50)) {
                const encodedData = new Uint8Array([14, 1]);//sword
                const encodedData2 = new Uint8Array([14, 12]);//cookie
                const encodedData3 = new Uint8Array([14, 9]);//trap
                const encodedData4 = new Uint8Array([14, 19]);//powermill
                const encodedData5 = new Uint8Array([14, 20]);//spike
                const encodedData6 = new Uint8Array([14, 15]);//hammer
                const encodedData7 = new Uint8Array([14, 8]);//platform

                const encodedData9 = new Uint8Array([14, 17]);//katana
                const encodedData10 = new Uint8Array([14, 16]);//bed
                this.send(encodedData);
                this.send(encodedData2);
                this.send(encodedData3);
                this.send(encodedData4);
                this.send(encodedData5);
                this.send(encodedData6);
                this.send(encodedData7);
                this.send(encodedData9);
                this.send(encodedData10);
                lastSpawnTime = Date.now();
            }
            if (item == 19 && autoRespawn && (Date.now() - lastSpawnTime > 50)) {
                nick.value = autoRespawnName.value;
                play.click();
                lastSpawnTime = Date.now();
            }

            if (item == 35) { killCount = 0 };
            if (item == 28 && (Date.now() - lastSpawnTime > 50)) {
                killCount++;
                if (killChat) {
                    //const playerkilled = data[1].split(' ')[1];
                    const playerkilled = data[1].substring(6);
                    logToCustomConsole(playerkilled);
                    killChatTextValue = killChatText.value;
                    this.send(new Uint8Array([7, ...new TextEncoder().encode(killChatTextValue.replace('[kills]', killCount).replace('[playerkilled]', playerkilled))]));
                }
                lastSpawnTime = Date.now();
            }

            if (item == 32 && (Date.now() - lastSpawnTime > 700)) {
                const playerName = data[2];
                const playerId = data[1];
                if (spawnChat) {
                    spawnContent = spawnChatInputText.value;
                    if (showID) {
                        this.send(new Uint8Array([7, ...new TextEncoder().encode(`${spawnContent.replace('[player]', playerName)} ID: ${playerId}`)]));
                    } else {
                        this.send(new Uint8Array([7, ...new TextEncoder().encode(spawnContent.replace('[player]', playerName))]));
                    }
                }
                lastSpawnTime = Date.now();
            }
        } catch (error) {
            console.error('Error processing message:', error);
        }
    });
};