// ==UserScript==
// @name owopfuck.cc
// @namespace http://tampermonkey.net/
// @version 1.4
// @license MIT
// @description cool bot
// @author ukrainian nigger i censored
// @match *://augustberchelmann.com/owop/*
// @match *://ourworldofpixels.com/*
// @match *://ywop.scar17off.repl.co/*
// @match *://owop.scar17off.repl.co/*
// @icon https://www.google.com/s2/favicons?domain=ourworldofpixels.com
// @grant none
// @require https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.7.1/socket.io.js
// @namespace none
// ==/UserScript==
const SCRIPT_VERSION = "1.4";
(function () {
"use strict";
var I = 6666666;
if (location.host == "ourworldofpixels.com") I = 0; // OWOP is using different event IDs
const events = {
"loaded": I + 1,
"init": I + 2,
"tick": I + 3,
"misc": {
"toolsRendered": I + 4,
"toolsInitialized": I + 5,
"logoMakeRoom": I + 6,
"worldInitialized": I + 7,
"windowAdded": I + 8,
"captchaToken": I + 9,
"loadingCaptcha": I + 10
},
"renderer": {
"addChunk": I + 11,
"rmChunk": I + 12,
"updateChunk": I + 13
},
"camera": {
"moved": I + 14,
"zoom": I + 15
},
"net": {
"connecting": I + 16,
"connected": I + 17,
"disconnected": I + 18,
"playerCount": I + 19,
"chat": I + 20,
"devChat": I + 21,
"world": {
"leave": I + 22,
"join": I + 23,
"joining": I + 24,
"setId": I + 25,
"playersMoved": I + 26,
"playersLeft": I + 27,
"tilesUpdated": I + 28,
"teleported": I + 29
},
"chunk": {
"load": I + 30,
"unload": I + 31,
"set": I + 32,
"lock": I + 33,
"allLoaded": I + 34
},
"sec": {
"rank": I + 35
},
"maxCount": I + 36,
"donUntil": I + 37
}
};
window.onload = () => OWOP.on(events.net.world.join, () => {
if (!OWOP.cursors.paste && OWOP.cursors.stamp) OWOP.cursors.paste = OWOP.cursors.stamp;
if (!OWOP.tools) OWOP.tools = OWOP.tool;
if (!OWOP.tool) OWOP.tool = OWOP.tools;
if (typeof localStorage == 'undefined') localStorage = sessionStorage;
!function (e) { "use strict"; function t() { } function n(e, t) { for (var n = e.length; n--;)if (e[n].listener === t) return n; return -1 } function r(e) { return function () { return this[e].apply(this, arguments) } } var i = t.prototype, s = e.EventEmitter; i.getListeners = function (e) { var t, n, r = this._getEvents(); if (e instanceof RegExp) for (n in t = {}, r) r.hasOwnProperty(n) && e.test(n) && (t[n] = r[n]); else t = r[e] || (r[e] = []); return t }, i.flattenListeners = function (e) { var t, n = []; for (t = 0; t < e.length; t += 1)n.push(e[t].listener); return n }, i.getListenersAsObject = function (e) { var t, n = this.getListeners(e); return n instanceof Array && ((t = {})[e] = n), t || n }, i.addListener = function (e, t) { if (!function e(t) { return "function" == typeof t || t instanceof RegExp || !(!t || "object" != typeof t) && e(t.listener) }(t)) throw TypeError("listener must be a function"); var r, i = this.getListenersAsObject(e), s = "object" == typeof t; for (r in i) i.hasOwnProperty(r) && -1 === n(i[r], t) && i[r].push(s ? t : { listener: t, once: !1 }); return this }, i.on = r("addListener"), i.addOnceListener = function (e, t) { return this.addListener(e, { listener: t, once: !0 }) }, i.once = r("addOnceListener"), i.defineEvent = function (e) { return this.getListeners(e), this }, i.defineEvents = function (e) { for (var t = 0; t < e.length; t += 1)this.defineEvent(e[t]); return this }, i.removeListener = function (e, t) { var r, i, s = this.getListenersAsObject(e); for (i in s) s.hasOwnProperty(i) && -1 !== (r = n(s[i], t)) && s[i].splice(r, 1); return this }, i.off = r("removeListener"), i.addListeners = function (e, t) { return this.manipulateListeners(!1, e, t) }, i.removeListeners = function (e, t) { return this.manipulateListeners(!0, e, t) }, i.manipulateListeners = function (e, t, n) { var r, i, s = e ? this.removeListener : this.addListener, o = e ? this.removeListeners : this.addListeners; if ("object" != typeof t || t instanceof RegExp) for (r = n.length; r--;)s.call(this, t, n[r]); else for (r in t) t.hasOwnProperty(r) && (i = t[r]) && ("function" == typeof i ? s.call(this, r, i) : o.call(this, r, i)); return this }, i.removeEvent = function (e) { var t, n = this._getEvents(); if ("string" == typeof e) delete n[e]; else if (e instanceof RegExp) for (t in n) n.hasOwnProperty(t) && e.test(t) && delete n[t]; else delete this._events; return this }, i.removeAllListeners = r("removeEvent"), i.emitEvent = function (e, t) { var n, r, i, s, o = this.getListenersAsObject(e); for (s in o) if (o.hasOwnProperty(s)) for (n = o[s].slice(0), i = 0; i < n.length; i++)!0 === (r = n[i]).once && this.removeListener(e, r.listener), r.listener.apply(this, t || []) === this._getOnceReturnValue() && this.removeListener(e, r.listener); return this }, i.trigger = r("emitEvent"), i.emit = function (e) { var t = Array.prototype.slice.call(arguments, 1); return this.emitEvent(e, t) }, i.setOnceReturnValue = function (e) { return this._onceReturnValue = e, this }, i._getOnceReturnValue = function () { return !this.hasOwnProperty("_onceReturnValue") || this._onceReturnValue }, i._getEvents = function () { return this._events || (this._events = {}) }, t.noConflict = function () { return e.EventEmitter = s, t }, "function" == typeof define && define.amd ? define(function () { return t }) : "object" == typeof module && module.exports ? module.exports = t : e.EventEmitter = t }("undefined" != typeof window ? window : this || {});
// Pray to god this method of font drawing will work.
function getTextImageData(text, font) {
var tempCanvas = document.createElement('canvas');
var tempCtx = tempCanvas.getContext('2d');
tempCtx.font = font;
var textMetrics = tempCtx.measureText(text);
tempCanvas.width = textMetrics.width;
tempCanvas.height = parseInt(font, 10);
tempCtx.font = font;
tempCtx.fillText(text, 0, parseInt(font, 10));
var imageData = tempCtx.getImageData(0, 0, tempCanvas.width, tempCanvas.height);
tempCanvas.remove();
return imageData;
};
// this nigger took me 2.5 hours to finish
function addResizeableProperty(elementId, elementId2, element) {
const resizableDiv = document.getElementById(elementId);
const eventHandlerDiv = document.getElementById(elementId2);
let isResizing = false;
let startX;
let startY;
let startWidth;
let startHeight;
eventHandlerDiv.addEventListener('mousedown', (e) => {
if (e.target === eventHandlerDiv) {
isResizing = true;
startX = e.clientX;
startY = e.clientY;
startWidth = parseInt(getComputedStyle(resizableDiv).width, 10);
startHeight = parseInt(getComputedStyle(resizableDiv).height, 10);
document.addEventListener('mousemove', resize);
document.addEventListener('mouseup', stopResize);
}
});
function resize(e) {
if (!isResizing) return;
const newWidth = startWidth + e.clientX - startX;
const newHeight = startHeight + e.clientY - startY;
// this is useless
// const widthChange = newWidth - startWidth;
const heightChange = newHeight - startHeight;
resizableDiv.style.width = `${newWidth}px`;
resizableDiv.style.height = `${newHeight}px`;
resizableDiv.style.maxWidth = `${newWidth}px`;
resizableDiv.style.maxHeight = `${newHeight}px`;
// this code is shit
if (resizableDiv.id == "window-owopfuck") {
document.getElementById("owopfuck-title").childNodes.forEach(node => {
if (node.style) {
node.style.fontSize = newWidth <= 750 ? "0px" : "20px";
};
});
document.getElementById("owopfuck-tablist").style.textAlign = newWidth <= 750 ? "unset" : "right";
};
const sections = document.querySelectorAll(".owopfuck-section");
const windowSize = parseInt(document.getElementById("window-owopfuck").style.height.replace("px", ''));
// set section height
sections.forEach(section => {
section.style.height = windowSize - 60 + "px";
});
// set full tab heights
document.querySelectorAll(".owopfuck-full-tab").forEach(node => {
node.style.height = windowSize - 60 + "px";
});
window.animbuilderCenter.y = (windowSize - 60) / 2;
};
function stopResize() {
isResizing = false;
document.removeEventListener('mousemove', resize);
document.removeEventListener('mouseup', stopResize);
};
};
function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
};
return array;
};
const createExpressionFunction = (expression) => {
return new Function('pos', 'length', 'i', 'f', `return ${expression};`);
};
function gameToSize(gameX, gameY) {
var sc = 16 / 16;
var pixelSize = 32 * sc;
var screenWidth = Math.ceil(gameX * pixelSize);
var screenHeight = Math.ceil(gameY * pixelSize);
return {
width: screenWidth / 2 + 'px',
height: screenHeight / 2 + 'px'
};
};
function lerpColor(color1, color2, alpha) {
const r = Math.round(lerp(color1[0], color2[0], alpha));
const g = Math.round(lerp(color1[1], color2[1], alpha));
const b = Math.round(lerp(color1[2], color2[2], alpha));
return [r, g, b];
};
function lerp(color1, color2, factor) {
if (arguments.length < 3) {
factor = 0.5;
};
var result = color1.slice();
for (var i = 0; i < 3; i++) {
result[i] = Math.round(result[i] + factor * (color2[i] - color1[i]));
}
return result;
};
const getIbyXY = (x, y, w) => (y * w + x) * 4;
function pixColor(img, X, Y) {
var data = img.getImageData(X, Y, 1, 1).data;
return [data[0], data[1], data[2]];
};
function getRandomItemFromArray(array) {
let randomIndex = Math.floor(Math.random() * array.length);
return array[randomIndex];
};
const upload = (accept = "*") => new Promise(resolve => {
let file = document.createElement('input');
file.type = "file";
file.accept = accept;
file.onchange = () => {
let reader = new FileReader();
reader.onloadend = () => {
resolve(reader.result);
};
reader.readAsDataURL(file.files[0]);
};
file.click();
});
function rgb2int(rgb) {
return ((rgb[0] & 0x0ff) << 16) | ((rgb[1] & 0x0ff) << 8) | (rgb[2] & 0x0ff)
};
const eq = (a, b) => a[0] === b[0] && a[1] === b[1] && a[2] === b[2];
var OJS = [];
const error = m => console.error("%c " + m, "color: #ff0000");
/*
Events:
name - description [arguments].
open - Opened WebSocket connection.
close - Closed WebSocket connection.
join - Joined to world [world name].
id - Got id [id].
rawMessage - Any message from WebSocket server. (It can be object or string) [data].
update - Player in world updates [player object].
pixel - New pixel in world [x, y, [r, g, b]].
disconnect - Someone in world disconnected [player object].
teleport - got 'teleport' opcode. Very rare. [x, y].
rank - Got new rank. [rank].
captcha - Captcha state. [gcaptcha id].
chunkProtect - Chunk (un)protected. [x, y, newState].
pquota - New PQuota. [rate, per].
destroy - Socket was destroyed and won't reconnect anymore.
chunk - New chunk. [x, y, chunk, protected].
message - New message in chat. [msg].
*/
class ChunkSystem {
constructor() {
this.chunks = [];
this.chunkProtected = [];
};
setChunk(x, y, data) {
if (!data || typeof x !== "number" || typeof y !== "number") return error("ChunkSystem.setChunk: failed to set chunk (no data or invalid coords).");
if (data.constructor.name !== "Array") data = Array.from(data);
if (!this.chunks[x]) this.chunks[x] = [];
return this.chunks[x][y] = data;
};
getChunk(x, y, raw) {
if (!raw) {
x = Math.floor(x / Client.options.chunkSize);
y = Math.floor(y / Client.options.chunkSize);
};
if (!this.chunks[x]) return;
return this.chunks[x][y];
};
removeChunk(x, y) {
if (!this.chunks[x]) return;
if (!this.chunks[x][y]) return;
return this.chunks[x].splice(y, 1);
};
setPixel(x, y, rgb) {
if (!rgb || typeof rgb !== "object" || typeof x !== "number" || typeof y !== "number") return error("ChunkSystem.setPixel: failed to set pixel (no/wrong rgb or invalid coords).");
const chunkX = Math.floor(x / Client.options.chunkSize);
const chunkY = Math.floor(y / Client.options.chunkSize);
if (!this.chunks[chunkX]) return;
const chunk = this.chunks[chunkX][chunkY];
if (!chunk) return false;
const i = getIbyXY(x & Client.options.chunkSize - 1, y & Client.options.chunkSize - 1, Client.options.chunkSize);
chunk[i] = rgb[0];
chunk[i + 1] = rgb[1];
chunk[i + 2] = rgb[2];
return true;
};
getPixel(x, y) {
if (typeof x !== "number" || typeof y !== "number") return error("ChunkSystem.getPixel: failed to get pixel (invalid coords).");
const chunkX = Math.floor(x / Client.options.chunkSize);
const chunkY = Math.floor(y / Client.options.chunkSize);
if (!this.chunks[chunkX]) return;
const chunk = this.chunks[chunkX][chunkY];
const i = getIbyXY(x & Client.options.chunkSize - 1, y & Client.options.chunkSize - 1, Client.options.chunkSize);
return [chunk[i], chunk[i + 1], chunk[i + 2]];
};
protectChunk(x, y) {
if (typeof x !== "number" || typeof y !== "number") return error("ChunkSystem.protectChunk: failed to protect chunk (invalid coords).");
if (!this.chunkProtected[x]) this.chunkProtected[x] = [];
return this.chunkProtected[x][y] = true;
}
unProtectChunk(x, y) {
if (typeof x !== "number" || typeof y !== "number") return error("ChunkSystem.unprotectChunk: failed to unprotect chunk (invalid coords).");
if (!this.chunkProtected[x]) return false;
this.chunkProtected[x][y] = false;
return true;
}
isProtected(x, y) {
if (typeof x !== "number" || typeof y !== "number") return error("ChunkSystem.isProtected: failed to check (invalid coords).");
if (!this.chunkProtected[x]) return false;
return Boolean(this.chunkProtected[x][y]);
}
};
const Chunks = new ChunkSystem();
class Client {
/**
* @param {Object} options Options for connection
* @param {?number} options.id ID for logging. If not set, OWOP ID will be used. ✔️
* @param {string} [options.world=main] World name. ✔️
* @param {?boolean} options.noLog No logging. ✔️
* @param {?boolean} options.reconnect Reconnect if disconnected. ✔️
* @param {?string} options.adminlogin Admin login. ✔️
* @param {?string} options.modlogin Mod login. ✔️
* @param {?string} options.pass Pass for world. ✔️
* @param {?string} options.captchapass Captcha pass. ✔️
* @param {?string} options.teleport Teleport on 'teleport' opcode. ✔️
* @param {number} [options.reconnectTime=5000] Reconnect time (ms) after disconnect. ✔️
* @param {?boolean} options.unsafe Use methods that are supposed to be only for admin or moderator. ✔️
* @param {?boolean} options.simpleChunks Use original OWOP chunks instead of OJS. ✔️
*/
constructor(options = {}) {
if (!options.world) options.world = "main";
if (!options.reconnectTime) options.reconnectTime = 2500;
if (!options.captchaSiteKey) options.captchaSiteKey = "6LcgvScUAAAAAARUXtwrM8MP0A0N70z4DHNJh-KI";
let types = {
"glitch": ".glitch.me/?ws=",
"replit": ".repl.co/?ws="
};
if (options.proxy && !options.proxyType) {
if (options.proxy.includes(".")) options.proxyType = "replit";
else options.proxyType = "glitch";
};
if (options.proxy && !options.zombie) options.ws = new WebSocket(`wss://${options.proxy}${types[options.proxyType]}${options.ws.url}`, null, options.ws.options);
if (options.zombie) options.ws = new BotNetReplicator(options.zombie);
const OJS = this;
this.clientOptions = options;
this.RANK = {
ADMIN: 3,
MODERATOR: 2,
USER: 1,
NONE: 0
};
this.options = {
chunkSize: 16,
maxChatBuffer: 256,
maxMessageLength: {
0: 128,
1: 128,
2: 512,
3: 16384
},
maxWorldNameLength: 24,
worldBorder: 0xFFFFFF,
opcode: {
setId: 0,
worldUpdate: 1,
chunkLoad: 2,
teleport: 3,
setRank: 4,
captcha: 5,
setPQuota: 6,
chunkProtected: 7
},
captchaState: {
CA_WAITING: 0,
CA_VERIFYING: 1,
CA_VERIFIED: 2,
CA_OK: 3,
CA_INVALID: 4
},
captchaStateNames: {
0: "WAITING",
1: "VERIFYING",
2: "VERIFIED",
3: "OK",
4: "INVALID"
}
};
if (window.document === undefined) {
this.options.misc = {
chatVerification: String.fromCharCode(10),
tokenVerification: "CaptchA",
worldVerification: 25565
};
} else this.options.misc = {
chatVerification: OWOP.options.serverAddress[0].proto.misc.chatVerification,
tokenVerification: OWOP.options.serverAddress[0].proto.misc.tokenVerification,
worldVerification: OWOP.options.serverAddress[0].proto.misc.worldVerification
};
OJS.chat = {
send(msg) {
if (typeof OJS.player.rank !== "number") return false;
msg = OJS.chat.sendModifier(msg);
OJS.net.ws.send(msg.substr(0, OJS.options.maxMessageLength[OJS.player.rank]) + OJS.options.misc.chatVerification);
return true;
},
local(msg) {
OJS.util.log(msg)
},
sendModifier(msg) {
return msg
},
recvModifier(msg) {
return msg
},
messages: []
};
OJS.world = {
join(world = "main") {
if (OJS.net.ws.readyState !== 1 || !OJS.net.isWebsocketConnected) return false;
let ints = [];
world = world.toLowerCase();
for (let i = 0; i < world.length && i < 24; i++) {
let charCode = world.charCodeAt(i);
if ((charCode < 123 && charCode > 96) || (charCode < 58 && charCode > 47) || charCode === 95 || charCode === 46)
ints.push(charCode);
}
let array = new ArrayBuffer(ints.length + 2);
let dv = new DataView(array);
for (let i = ints.length; i--;) dv.setUint8(i, ints[i]);
dv.setUint16(ints.length, OJS.options.misc.worldVerification, true);
OJS.net.ws.send(array);
OJS.util.log(`Joining world: ${world}`);
OJS.world.name = world;
return true;
},
leave() {
OJS.net.isWorldConnected = false;
OJS.net.isWebsocketConnected = false;
OJS.net.ws.close();
},
destroy() {
OJS.net.isWorldConnected = false;
OJS.net.isWebsocketConnected = false;
OJS.net.destroyed = true;
OJS.net.ws.close();
OJS.emit("destroy");
},
move(x = 0, y = 0) {
if (OJS.net.ws.readyState !== 1 || !OJS.net.isWebsocketConnected) return false;
if (!x || !y) return false;
OJS.player.x = x;
OJS.player.y = y;
if (document.getElementById(`owopfuck-${OJS.player.id}-x`)) document.getElementById(`owopfuck-${OJS.player.id}-x`).innerText = Math.floor(x);
if (document.getElementById(`owopfuck-${OJS.player.id}-y`)) document.getElementById(`owopfuck-${OJS.player.id}-y`).innerText = Math.floor(y);
x *= 16;
y *= 16;
const dv = new DataView(new ArrayBuffer(12));
OJS.player.worldX = x;
OJS.player.worldY = y;
dv.setInt32(0, x, true);
dv.setInt32(4, y, true);
dv.setUint8(8, OJS.player.color[0]);
dv.setUint8(9, OJS.player.color[1]);
dv.setUint8(10, OJS.player.color[2]);
dv.setUint8(11, OJS.player.tool);
OJS.net.ws.send(dv.buffer);
OJS.highlight.move();
return true;
},
setPixel(x = OJS.player.x, y = OJS.player.y, color = OJS.player.color, move = true) {
if (!OJS.net.bucket.canSpend(1) && location.origin == "ourworldofpixels.com") return false;
let pixel = OWOP.world.getPixel(x, y);
if (eq(pixel, color)) return;
if (OJS.net.ws.readyState !== 1 || !OJS.net.isWebsocketConnected || OJS.player.rank === OJS.RANK.NONE) return false;
const oldX = OJS.player.x,
oldY = OJS.player.y;
if (getValue("smartsneaky")) {
let distx = Math.trunc(x / Client.options.chunkSize) - Math.trunc(oldX / Client.options.chunkSize);
distx *= distx;
let disty = Math.trunc(y / Client.options.chunkSize) - Math.trunc(oldY / Client.options.chunkSize);
disty *= disty;
let dist = Math.sqrt(distx + disty);
if (dist >= 3) OJS.world.move(x, y);
} else {
if (move) OJS.world.move(x, y);
};
const dv = new DataView(new ArrayBuffer(11));
dv.setInt32(0, x, true);
dv.setInt32(4, y, true);
dv.setUint8(8, color[0]);
dv.setUint8(9, color[1]);
dv.setUint8(10, color[2]);
OJS.player.color = color;
OJS.net.ws.send(dv.buffer);
if (getValue("wolfmove")) OJS.world.move(oldX, oldY);
document.getElementById(`owopfuck-${OJS.player.id}-color`).childNodes[0].style.backgroundColor = "rgb(" + OJS.player.color + ")";
return true;
},
setTool(id = 0) {
if (OJS.net.ws.readyState !== 1 || !OJS.net.isWebsocketConnected) return false;
OJS.player.tool = id;
const dv = new DataView(new ArrayBuffer(12));
dv.setInt32(0, OJS.player.worldX, true);
dv.setInt32(4, OJS.player.worldY, true);
dv.setUint8(8, OJS.player.color[0]);
dv.setUint8(9, OJS.player.color[1]);
dv.setUint8(10, OJS.player.color[2]);
dv.setUint8(11, id);
OJS.net.ws.send(dv.buffer);
return true;
},
setColor(color = [0, 0, 0]) {
if (OJS.net.ws.readyState !== 1 || !OJS.net.isWebsocketConnected) return false;
OJS.player.color = color;
const dv = new DataView(new ArrayBuffer(12));
dv.setInt32(0, OJS.player.worldX, true);
dv.setInt32(4, OJS.player.worldY, true);
dv.setUint8(8, OJS.player.color[0]);
dv.setUint8(9, OJS.player.color[1]);
dv.setUint8(10, OJS.player.color[2]);
dv.setUint8(11, OJS.player.tool);
OJS.net.ws.send(dv.buffer);
return true;
},
protectChunk(x = OJS.player.x, y = OJS.player.y, newState = 1) {
if (OJS.net.ws.readyState !== 1 || !OJS.net.isWebsocketConnected) return false;
if (OJS.player.rank < OJS.RANK.ADMIN && !options.unsafe) return false;
const dv = new DataView(new ArrayBuffer(10));
dv.setInt32(0, x, true);
dv.setInt32(4, y, true);
dv.setUint8(8, newState);
OJS.net.ws.send(dv.buffer);
return true;
},
clearChunk(x = OJS.player.x, y = OJS.player.y, rgb = OJS.player.color) {
if (OJS.player.rank === OJS.RANK.ADMIN || options.unsafe) {
const dv = new DataView(new ArrayBuffer(13));
dv.setInt32(0, x, true);
dv.setInt32(4, y, true);
dv.setUint8(8, rgb[0]);
dv.setUint8(9, rgb[1]);
dv.setUint8(10, rgb[2]);
OJS.net.ws.send(dv.buffer);
return true;
}
return false;
},
requestChunk(x, y, inaccurate) {
if (options.simpleChunks) return true;
if (OJS.net.ws.readyState !== 1 || !OJS.net.isWebsocketConnected) return false;
if (typeof x !== "number" && typeof y !== "number") {
x = OJS.player.x;
y = OJS.player.y;
inaccurate = true;
};
if (inaccurate) {
x = Math.floor(x / OJS.options.chunkSize);
y = Math.floor(y / OJS.options.chunkSize);
};
let wb = OJS.options.worldBorder;
if (x > wb || y > wb || x < ~wb || y < ~wb) return;
let dv = new DataView(new ArrayBuffer(8));
dv.setInt32(0, x, true);
dv.setInt32(4, y, true);
OJS.net.ws.send(dv.buffer);
return true;
},
getPixel(x = OJS.player.x, y = OJS.player.y) {
if (options.simpleChunks) return OWOP.world.getPixel(x, y);
// It'll return undefined on unknown chunk but it'll request it, so you'll need to getPixel(x, y) again. I suggest you requesting chunks manually and getting them from ChunkSystem.
if (!Chunks.getChunk(x, y)) OJS.world.requestChunk(x, y, true);
return Chunks.getPixel(x, y);
}
};
OJS.captcha = {
usedKeys: [],
login(key) {
if (!OJS.net.ws ||
OJS.net.ws.readyState !== 1) return false;
if (OJS.captcha.usedKeys.includes(key)) {
return false
} else if (!key.startsWith(Client.options.misc.tokenVerification)) {
OJS.captcha.usedKeys.push(key);
}
OJS.net.ws.send(Client.options.misc.tokenVerification + key);
OJS.captcha.usedKeys.push(key);
return true;
},
renderCaptcha(uniqueName = true) {
return new Promise(resolve => {
OWOP.windowSys.addWindow(new OWOP.windowSys.class.window(`Verification Needed ` + (uniqueName ? String.fromCharCode(Math.random() * 100) : ''), {
closeable: true,
moveable: true,
centered: true
}, win => {
win.container.parentNode.style["z-index"] = "101";
grecaptcha.render(win.addObj(OWOP.util.mkHTML('div', {})), {
theme: 'dark',
sitekey: OJS.clientOptions.captchaSiteKey,
callback: token => {
win.close();
resolve(token);
}
});
}));
});
},
async renderAndLogin(unique = true) {
OJS.captcha.login(await OJS.captcha.renderCaptcha(unique));
}
};
OJS.world.originalSetPixel = OJS.world.setPixel;
OJS.player = {
x: 0,
y: 0,
worldX: 0,
worldY: 0,
tool: 0,
rank: null,
id: null,
color: [0, 0, 0]
};
let highlight_element = document.createElement("div");
highlight_element.style.position = 'fixed';
highlight_element.style.transformOrigin = 'left top 0px';
highlight_element.style.overflow = 'hidden';
highlight_element.style.width = '40px';
highlight_element.style.height = '40px';
highlight_element.style.backgroundColor = 'rgba(0, 255, 0, 0.7)';
OJS.highlight = {
shown: false,
ismag: false,
element: highlight_element
};
OJS.highlight.move = () => {
let tools = {
0: 'cursor',
1: 'move',
2: 'pipette',
3: 'eraser',
4: 'zoom',
5: 'fill',
6: 'paste',
7: 'export',
8: 'line',
9: 'protect',
10: 'copy'
};
var sc = OWOP.camera.zoom / 16;
var pixelSize = 32 * sc;
var gameX = OJS.player.x / 2;
var gameY = OJS.player.y / 2;
var screenX = (-OWOP.camera.x) * OWOP.camera.zoom + gameX * pixelSize - OWOP.tools.allTools[tools[OJS.player.tool]].offset[0];
var screenY = (-OWOP.camera.y) * OWOP.camera.zoom + gameY * pixelSize
if (screenX > -512 && screenY > -512 && screenX < window.innerWidth && screenY < window.innerHeight) {
if (sc > 1.0 && !OJS.highlight.ismag) {
OJS.highlight.ismag = true;
OJS.highlight.element.style.imageRendering = 'pixelated';
} else if (sc <= 1.0 && OJS.highlight.ismag) {
OJS.highlight.ismag = false;
OJS.highlight.element.style.imageRendering = 'auto';
};
OJS.highlight.element.style.transform = `matrix(${sc}, 0, 0, ${sc}, ${Math.round(screenX)}, ${Math.round(screenY)})`;
if (!OJS.highlight.shown) {
OWOP.elements.viewport.appendChild(OJS.highlight.element);
OJS.highlight.shown = true;
};
} else {
if (OJS.highlight.shown) {
OJS.highlight.element.remove();
OJS.highlight.shown = false;
};
};
if (!getValue("bothighlight")) {
OJS.highlight.shown = false;
OWOP.removeListener(OWOP.events.tick, OJS.highlight.move);
OJS.highlight.element.remove();
};
};
OJS.players = {};
OJS.net = {
isWebsocketConnected: false,
isWorldConnected: false,
destroyed: false,
bucket: new Bucket(32, 4, OJS),
async dataHandler(data) {
if (typeof data !== "object") return error("Client.net.dataHandler: data is not object.");
const realData = data;
data = new DataView(data);
const opcode = data.getUint8(0);
switch (opcode) {
case OJS.options.opcode.setId:
{
OJS.emit("id", data.getUint32(1, true));
OJS.player.id = data.getUint32(1, true);
OJS.net.isWorldConnected = true;
if (typeof OJS.player.rank !== "number") OJS.player.rank = OJS.RANK.NONE;
OJS.util.log(`Joined world '${OJS.world.name}' and got id '${data.getUint32(1, true)}'`, "color: #00ff00");
if (options.adminlogin) OJS.chat.send("/adminlogin " + options.adminlogin);
if (options.modlogin) OJS.chat.send("/modlogin " + options.modlogin);
if (options.pass) OJS.chat.send("/pass " + options.pass);
OJS.emit("join", OJS.world.name);
/*
Bypass antibot
if(location.origin == "ourworldofpixels.com") {
fetch('https://opm.dimden.dev/client/img/polybius.png?' + Date.now(), {
'credentials': 'include',
'headers': {
'x-caching': protect('p+' + Math.floor(Date.now() / 60000) * 60000, randomIP())
}
});
};
*/
let table = document.createElement("tr");
let connection = "🖥️";
if (options.proxy) connection = "📡";
if (options.zombie) connection = "🧟";
table.innerHTML = `
${connection} |
${OJS.player.id} |
0 |
0 |
|
${OJS.net.bucket.allowance} |
| `;
table.id = `owopfuck-bot-${OJS.player.id}`;
document.getElementById("owopfuck-bots").appendChild(table);
document.getElementById(`owopfuck-${OJS.player.id}-disconnect`).addEventListener("click", () => {
OJS.net.ws.close();
document.getElementById(`owopfuck-bot-${OJS.player.id}`).remove();
});
break;
}
case OJS.options.opcode.worldUpdate:
{
// Players
let updated = false;
let updates = {};
for (let i = data.getUint8(1); i--;) {
updated = true;
let pid = data.getUint32(2 + i * 16, true);
if (pid === OJS.player.id) continue;
let pmx = data.getUint32(2 + i * 16 + 4, true);
let pmy = data.getUint32(2 + i * 16 + 8, true);
let pr = data.getUint8(2 + i * 16 + 12);
let pg = data.getUint8(2 + i * 16 + 13);
let pb = data.getUint8(2 + i * 16 + 14);
let ptool = data.getUint8(2 + i * 16 + 15);
updates[pid] = {
x: pmx,
y: pmy,
rgb: [pr, pg, pb],
tool: ptool
};
}
if (updated) {
for (let i in updates) {
if (!OJS.players[i]) OJS.emit("connect", i);
OJS.players[i] = {
id: i,
x: updates[i].x >> 4,
y: updates[i].y >> 4,
rgb: updates[i].rgb,
tool: updates[i].tool
};
OJS.emit("update", OJS.players[i]);
}
};
// Pixels
let off = 2 + data.getUint8(1) * 16;
for (let i = data.getUint16(off, true), j = 0; j < i; j++) {
let
x = data.getInt32(2 + off + j * 15 + 4, true),
y = data.getInt32(2 + off + j * 15 + 8, true);
let r = data.getUint8(2 + off + j * 15 + 12),
g = data.getUint8(2 + off + j * 15 + 13),
b = data.getUint8(2 + off + j * 15 + 14);
OJS.emit('pixel', x, y, [r, g, b]);
Chunks.setPixel(x, y, [r, g, b]);
}
// Disconnects
off += data.getUint16(off, true) * 15 + 2;
for (let k = data.getUint8(off); k--;) {
let dpid = data.getUint32(1 + off + k * 4, true);
if (OJS.players[dpid]) {
OJS.emit("disconnect", OJS.players[dpid]);
delete OJS.players[dpid];
}
}
break;
}
case OJS.options.opcode.chunkLoad:
{
let chunkX = data.getInt32(1, true);
let chunkY = data.getInt32(5, true);
let locked = !!data.getUint8(9);
let u8data = new Uint8Array(realData, 10, realData.byteLength - 10);
let decompressed = OJS.util.decompress(u8data)
Chunks.setChunk(chunkX, chunkY, decompressed);
if (locked) Chunks.protectChunk(chunkX, chunkY);
OJS.emit('chunk', chunkX, chunkY, decompressed, locked);
break;
}
case OJS.options.opcode.teleport:
{
if (!options.teleport) break;
const x = data.getInt32(1, true);
const y = data.getInt32(5, true);
OJS.world.move(x, y);
OJS.emit("teleport", x, y);
break;
}
case OJS.options.opcode.setRank:
{
OJS.player.rank = data.getUint8(1);
OJS.emit("rank", data.getUint8(1));
break;
}
case OJS.options.opcode.captcha:
{
switch (data.getUint8(1)) {
case OJS.options.captchaState.CA_WAITING:
OJS.util.log("CaptchaState: WAITING (0)", "color: #ffff00");
if (options.captchapass) {
OJS.net.ws.send(OJS.options.misc.tokenVerification + "LETMEINPLZ" + options.captchapass);
OJS.util.log("Used captchapass.", "color: #00ff00");
};
break;
case OJS.options.captchaState.CA_VERIFYING:
OJS.util.log("CaptchaState: VERIFYING (1)", "color: #ffff00");
break;
case OJS.options.captchaState.CA_VERIFIED:
OJS.util.log("CaptchaState: VERIFIED (2)", "color: #00ff00");
break;
case OJS.options.captchaState.CA_OK:
OJS.util.log("CaptchaState: OK (3)", "color: #00ff00");
OJS.world.join(options.world);
break;
case OJS.options.captchaState.CA_INVALID:
OJS.util.log("CaptchaState: INVALID (4)", "color: #ff0000");
OJS.util.log("Captcha failed. Websocket is invalid now.", "color: #ff0000");
OJS.net.destroyed = true;
OJS.net.isWorldConnected = false;
OJS.net.isWebsocketConnected = false;
OJS.emit("destroy");
break;
}
const id = data.getUint8(1);
OJS.emit("captcha", id);
(async () => {
if (id === 0) await OJS.captcha.renderAndLogin(true);
})();
break;
}
case OJS.options.opcode.setPQuota:
{
let rate = data.getUint16(1, true);
let per = data.getUint16(3, true);
if (rate == 0 && per == 0) return;
OJS.net.bucket = new Bucket(rate, per, OJS);
OJS.emit("pquota", rate, per);
if (document.getElementById(`owopfuck-${OJS.player.id}-pb`)) document.getElementById(`owopfuck-${OJS.player.id}-pb`).innerText = Math.floor(rate).toString();
let totalQuota = 0;
for (let i in bots) totalQuota += bots[i].net.bucket.rate;
let cps = (totalQuota / (16 * 16)).toFixed(3);
owopfuck.infowindow.container.childNodes[0].childNodes[15].innerText = "CPS: " + cps;
OJS.util.log(`New PQuota: ${rate}x${per}`);
break;
}
case OJS.options.opcode.chunkProtected:
{
let cx = data.getInt32(1, true);
let cy = data.getInt32(5, true);
let newState = data.getUint8(9);
if (newState) Chunks.protectChunk(cx, cy);
else Chunks.unProtectChunk(cx, cy);
OJS.emit("chunkProtect", cx, cy, newState);
break;
}
}
},
messageHandler(data) {
if (typeof data !== "string") return error("Client.net.messageHandler: data is not string.");
if (data.startsWith("You are banned")) {
OJS.util.log("Got ban message.", "color: #ff0000");
OJS.emit("banMessage");
OJS.emit("destroy");
OJS.net.isWorldConnected = false;
OJS.net.isWebsocketConnected = false;
return OJS.net.destroyed = true;
};
if (data.startsWith("DEV")) OJS.util.log("[DEV] " + data.slice(3));
if (data.startsWith("<")) return;
data = OJS.chat.recvModifier(data);
const nick = data.split(":")[0];
OJS.emit("message", data);
OJS.chat.messages.push(data);
if (OJS.chat.messages.length > OJS.options.maxChatBuffer) OJS.chat.messages.shift();
}
};
void
function makeSocket() {
let ws = options.ws;
if (!options.zombie) {
ws.binaryType = "arraybuffer";
ws.onopen = () => {
OJS.util.log("WebSocket connected!", "color: #00ff00");
OJS.net.isWebsocketConnected = true;
owopfuck.infowindow.container.childNodes[0].childNodes[0].innerText = `Bots: ${bots.filter(bot => bot.net.ws.readyState === 1).length}`;
OWOP.on(OWOP.events.tick, OJS.highlight.move);
OJS.emit("open");
};
ws.onmessage = msg => {
OJS.emit("rawMessage", msg.data);
if (typeof msg.data === "string") OJS.net.messageHandler(msg.data);
else if (typeof msg.data === "object") OJS.net.dataHandler(msg.data);
};
ws.onclose = () => {
OJS.emit("close");
OJS.util.log("WebSocket disconnected!", "color: #ff0000");
OJS.net.isWorldConnected = false;
OJS.net.isWebsocketConnected = false;
owopfuck.infowindow.container.childNodes[0].childNodes[0].innerText = `Bots: ${bots.filter(bot => bot.net.ws.readyState === 1).length}`;
if (options.reconnect && !OJS.net.destroyed) setTimeout(makeSocket, options.reconnectTime);
};
ws.onerror = () => {
OJS.util.log("WebSocket error!", "color: #ff0000");
OJS.net.isWorldConnected = false;
OJS.net.isWebsocketConnected = false;
};
OJS.net.ws = ws;
} else {
ws.on("open", () => {
OJS.util.log("WebSocket connected!", "color: #00ff00");
OJS.net.isWebsocketConnected = true;
owopfuck.infowindow.container.childNodes[0].childNodes[0].innerText = `Bots: ${bots.filter(bot => bot.net.ws.readyState === 1).length}`;
OWOP.on(OWOP.events.tick, OJS.highlight.move);
OJS.emit("open");
});
ws.on("message", msg => {
OJS.emit("rawMessage", msg);
if (typeof msg === "string") OJS.net.messageHandler(msg);
else if (typeof msg === "object") OJS.net.dataHandler(msg);
});
ws.on("close", () => {
OJS.emit("close");
OJS.util.log("WebSocket disconnected!", "color: #ff0000");
OJS.net.isWorldConnected = false;
OJS.net.isWebsocketConnected = false;
owopfuck.infowindow.container.childNodes[0].childNodes[0].innerText = `Bots: ${bots.filter(bot => bot.net.ws.readyState === 1).length}`;
if (options.reconnect && !OJS.net.destroyed) setTimeout(makeSocket, options.reconnectTime);
});
ws.on("error", () => {
OJS.util.log("WebSocket error!", "color: #ff0000");
OJS.net.isWorldConnected = false;
OJS.net.isWebsocketConnected = false;
});
OJS.net.ws = ws;
};
}();
OJS.util = {
log(...msg) {
if (options.noLog) return;
if (options.id) console.log(`[${options.id}] ${msg}`);
else if (OJS.player.id) console.log(`%c [${OJS.player.id}] ` + msg[0], msg[1]);
else console.log(`%c [?] ` + msg[0], msg[1]);
},
decompress(u8arr) {
// I'm not touching this shit anymore.
var originalLength = u8arr[1] << 8 | u8arr[0];
var u8decompressedarr = new Uint8Array(originalLength);
var numOfRepeats = u8arr[3] << 8 | u8arr[2];
var offset = numOfRepeats * 2 + 4;
var uptr = 0;
var cptr = offset;
for (var i = 0; i < numOfRepeats; i++) {
var currentRepeatLoc = (u8arr[4 + i * 2 + 1] << 8 | u8arr[4 + i * 2]) + offset;
while (cptr < currentRepeatLoc) {
u8decompressedarr[uptr++] = u8arr[cptr++];
}
var repeatedNum = u8arr[cptr + 1] << 8 | u8arr[cptr];
var repeatedColorR = u8arr[cptr + 2];
var repeatedColorG = u8arr[cptr + 3];
var repeatedColorB = u8arr[cptr + 4];
cptr += 5;
while (repeatedNum--) {
u8decompressedarr[uptr] = repeatedColorR;
u8decompressedarr[uptr + 1] = repeatedColorG;
u8decompressedarr[uptr + 2] = repeatedColorB;
uptr += 3;
}
}
while (cptr < u8arr.length) {
u8decompressedarr[uptr++] = u8arr[cptr++];
}
return u8decompressedarr;
}
};
if (options.unsafe) OJS.util.log("Using 'unsafe' option.", "color: #ffff00");
this._events = {};
};
on(event, fn) {
if (!this._events[event]) this._events[event] = [];
this._events[event].push(fn);
};
once(event, fn) {
if (!this._events[event]) this._events[event] = [];
this._events[event].push([fn]);
};
emit(event, ...args) {
if (!this._events[event]) return;
for (let i in this._events[event])
if (typeof this._events[event][i] === "function") this._events[event][i](...args);
else {
this._events[event][i][0](...args);
this._events[event].splice(i, 1);
}
};
off(event, fn) {
if (!this._events[event]) return;
for (let i in this._events[event])
if (String(this._events[event][i]) === String(fn)) this._events[event].splice(i, 1);
}
};
Client.RANK = {
ADMIN: 3,
MODERATOR: 2,
USER: 1,
NONE: 0
};
Client.options = {
chunkSize: 16,
maxChatBuffer: 256,
maxMessageLength: {
0: 128,
1: 128,
2: 512,
3: 16384
},
maxWorldNameLength: 24,
worldBorder: 0xFFFFFF,
opcode: {
setId: 0,
worldUpdate: 1,
chunkLoad: 2,
teleport: 3,
setRank: 4,
captcha: 5,
setPQuota: 6,
chunkProtected: 7
},
captchaState: {
CA_WAITING: 0,
CA_VERIFYING: 1,
CA_VERIFIED: 2,
CA_OK: 3,
CA_INVALID: 4
},
captchaStateNames: {
0: "WAITING",
1: "VERIFYING",
2: "VERIFIED",
3: "OK",
4: "INVALID"
}
};
if (window.document === undefined) {
Client.options.misc = {
chatVerification: String.fromCharCode(10),
tokenVerification: "CaptchA",
worldVerification: 25565
};
} else Client.options.misc = {
chatVerification: OWOP.options.serverAddress[0].proto.misc.chatVerification,
tokenVerification: OWOP.options.serverAddress[0].proto.misc.tokenVerification,
worldVerification: OWOP.options.serverAddress[0].proto.misc.worldVerification
};
class Bucket {
constructor(rate, time, bot, infinite = false) {
this.lastCheck = Date.now();
this.allowance = rate;
this.rate = rate;
this.time = time;
this.OJS = bot;
this.infinite = infinite;
};
update() {
this.allowance += (Date.now() - this.lastCheck) / 1000 * (this.rate / this.time);
this.lastCheck = Date.now();
if (this.allowance > this.rate) {
this.allowance = this.rate;
};
// if(document.getElementById(`owopfuck-${this.OJS.player.id}-pb`)) document.getElementById(`owopfuck-${this.OJS.player.id}-pb`).innerText = Math.floor(this.OJS.net.bucket.allowance).toString();
};
canSpend(count) {
if (this.infinite) return true;
this.update();
if (this.allowance < count) return false;
this.allowance -= count;
return true;
};
getTimeToRestore() {
if (this.allowance >= this.rate) return 0;
return (this.rate - this.allowance) / (this.rate / this.time);
};
async waitUntilRestore() {
const restoreTime = this.getTimeToRestore() * 1000;
return new Promise(resolve => setTimeout(resolve, restoreTime));
};
};
OJS = {
Client: Client,
ChunkSystem: ChunkSystem,
Chunks: Chunks,
Bucket: Bucket
};
OWOP.windowSys.addWindow(new OWOP.windowSys.class.window("owopfuck", {
closeable: false
}, function (win) {
let styles = document.createElement("style");
let tabsys = document.createElement("script");
let div = document.createElement("div");
let container = win.container;
container.id = "window-owopfuck";
container.style.overflow = "hidden";
container.parentNode.firstChild.remove();
container.style = `overflow-y: auto;
margin: 0 -5px -5px -5px;
-o-border-image: url(/img/window_in.png) 5 repeat;`;
container.classList = '';
container.parentNode.style["position"] = "absolute";
container.parentNode.style["pointer-events"] = "initial";
container.parentNode.style["background-color"] = "rgb(17, 19, 20)";
container.parentNode.style["border"] = "5px rgb(17, 19, 20) solid";
container.parentNode.style["-o-border-image"] = "none";
container.parentNode.style["border-image"] = "none";
container.parentNode.style["border-image-outset"] = "0px";
container.parentNode.style["box-shadow"] = "transparent 0px 0px 0px 0px";
container.parentNode.style["z-index"] = "100";
div.innerHTML = `
<
Connection |
ID |
X |
Y |
Color |
PB |
Actions |
`;
tabsys.innerHTML = `let owopfuck_tabs = [
document.getElementById("owopfuck-tab-main"),
document.getElementById("owopfuck-tab-bots"),
document.getElementById("owopfuck-tab-animbuilder"),
document.getElementById("owopfuck-tab-botnet"),
document.getElementById("owopfuck-tab-proxy"),
document.getElementById("owopfuck-tab-botlist")
];
const altTabs = ["botnet", "proxy", "botlist"]; // those pages require block display, not flex (css)
function settab(Tab) {
for(let i in owopfuck_tabs) {
let tab = owopfuck_tabs[i];
tab.hidden = true;
tab.style.display = "none";
document.getElementById("owopfuck-tabbtn-" + tab.id.slice(13)).classList = "owopfuck-tabbtn";
};
document.getElementById("owopfuck-tab-"+Tab).hidden = false;
document.getElementById("owopfuck-tab-"+Tab).style.display = "flex";
if(altTabs.includes(Tab))
document.getElementById("owopfuck-tab-"+Tab).style.display = "block";
document.getElementById("owopfuck-tabbtn-" + Tab).classList = "owopfuck-tabbtn-active";
};
settab("main")`;
styles.innerHTML = `
.animbuilder-canvas-container {
background-color: rgba(255, 255, 255, 0.03);
position: relative;
display: inline-block;
width: 300px;
height: 100%;
box-shadow: inset 0 0 8px 3px;
}
.input-group {
display: grid;
grid-auto-flow: dense;
}
.animbuilder-sets-container {
display: inline-block;
vertical-align: top;
margin-left: 5px;
cursor: pointer;
width: 48%;
height: 53vh;
}
#window-owopfuck > * {
font-family: arial;
}
.owopfuck-dropdown > option {
background-color: rgb(24, 26, 28);
border: 2px solid #222324;
border-radius: 3px;
}
.owopfuck-dropdown {
background-color: transparent;
border: 2px solid #222324;
border-radius: 3px;
margin-left: 10px;
color: rgb(230, 230, 230);
width: 93%;
margin-top: 1px;
}
.owopfuck-keyinput {
height: 18px;
width: 50px;
background: transparent;
border: 1px solid #222324;
border-radius: 3px;
margin-left: 10px;
color: white;
text-align: center;
}
input.owopfuck-range[type="range"] {
-webkit-appearance: none;
appearance: none;
background: transparent;
cursor: pointer;
width: 215px;
margin-left: 10px;
}
input.owopfuck-range[type="range"]:focus {
outline: none;
}
input.owopfuck-range[type="range"]::-webkit-slider-runnable-track {
background-color: #383839;
border-radius: 3px;
height: 5px;
}
input.owopfuck-range[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
margin-top: -5.5px;
background-color: #5666f2;
border-radius: 15px;
height: 16px;
width: 16px;
}
input.owopfuck-range[type="range"]::-moz-range-track {
background-color: #383839;
border-radius: 3px;
height: 5px;
}
input.owopfuck-range[type="range"]::-moz-range-thumb {
background-color: #5666f2;
border: none;
border-radius: 15px;
height: 16px;
width: 16px;
}
input.owopfuck-range2[type="range"] {
-webkit-appearance: none;
appearance: none;
background: transparent;
cursor: pointer;
width: 190px;
margin-left: 10px;
}
input.owopfuck-range2[type="range"]:focus {
outline: none;
}
input.owopfuck-range2[type="range"]::-webkit-slider-runnable-track {
background-color: #383839;
border-radius: 3px;
height: 5px;
}
input.owopfuck-range2[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
margin-top: -5.5px;
background-color: #5666f2;
border-radius: 15px;
height: 16px;
width: 16px;
}
input.owopfuck-range2[type="range"]::-moz-range-track {
background-color: #383839;
border-radius: 3px;
height: 5px;
}
input.owopfuck-range2[type="range"]::-moz-range-thumb {
background-color: #5666f2;
border: none;
border-radius: 15px;
height: 16px;
width: 16px;
}
.owopfuck-text {
background-color: transparent;
border: 2px solid #222324;
margin-left: 10px;
border-radius: 3px;
color: rgb(230, 230, 230);
}
.owopfuck-rangetext {
/* -moz-appearance: textfield; */
background-color: transparent;
border: 2px solid #222324;
margin-left: 10px;
border-radius: 3px;
color: rgb(230, 230, 230);
width: 35px;
text-align: center;
}
/*
.owopfuck-rangetext::-webkit-inner-spin-button,
.owopfuck-rangetext::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
*/
.owopfuck-label {
margin-left: 15px;
color: rgb(230, 230, 230);
font-size: 14px;
}
.owopfuck-cbtext {
position: absolute;
margin-top: 4px;
margin-left: 6px;
color: rgb(230, 230, 230);
font-size: 13px;
}
hr.owopfuck-hr {
border: solid 1px rgb(74, 86, 198);
box-shadow: rgb(74, 86, 198) 0px 0px 11px 2px;
margin-bottom: 5px;
margin-top: 3px;
}
label.owopfuck-section {
color: rgb(230, 230, 230);
}
div.owopfuck-section {
border-radius: 5px;
height: 530px;
background-color: rgb(22, 24, 26);
margin-right: 10px;
flex: 1;
}
div[id^="owopfuck-tab-"] {
display: flex;
margin-left: 10px;
margin-top: 8px;
overflow-y: auto;
}
#owopfuck-tablist {
text-align: right;
margin-top: -40px;
}
::-webkit-scrollbar-thumb {
background-color: rgb(65, 65, 65);
}
::-webkit-scrollbar-button {
display: none;
}
::-webkit-scrollbar {
width: 6px;
height: 1px;
}
html, body {
background-color: rgb(11, 11, 11);
}
.owopfuck-tabbtn {
border: none;
background: transparent;
width: 95px;
height: 40px;
color: rgb(150, 150, 150);
font-size: 11.5px;
padding: 0;
margin: 0;
}
.owopfuck-tabbtn:active, .owopfuck-tabbtn-active:active {
border: none;
-o-border-image: none;
border-image: none;
transition: -webkit-filter 0.125s;
transition: filter 0.125s;
transition: filter 0.125s, -webkit-filter 0.125s;
}
.owopfuck-tabbtn-active {
border: none;
background: linear-gradient(0deg, rgb(74 88 200 / 55%) 0%, rgba(0, 0, 0, 0) 100%);
border-bottom: solid 2px rgb(74 88 200);
width: 95px;
height: 40px;
color: rgb(150, 150, 150);
font-size: 11.5px;
padding: 0;
margin: 0;
}
.owopfuck-tabbtn:hover {
border: none;
background: linear-gradient(0deg, rgb(54 68 180 / 55%) 0%, rgba(0, 0, 0, 0) 100%);
border-bottom: solid 2px rgb(44 58 170);
width: 95px;
height: 40px;
color: rgb(150, 150, 150);
font-size: 11.5px;
padding: 0;
margin: 0;
}
.owopfuck-btn {
border: 2px solid #222324;
border-radius: 3px;
background: rgba(200, 200, 200, 0.01);
width: 93%;
height: 25px;
color: rgb(150, 150, 150);
font-size: 11.5px;
margin-bottom: 1px;
margin-top: 2px;
margin-left: 10px;
}
.owopfuck-smallbtn {
border: 2px solid #222324;
border-radius: 3px;
background: rgba(200, 200, 200, 0.01);
width: 72%;
height: 25px;
color: rgb(150, 150, 150);
font-size: 11.5px;
margin-bottom: 1px;
margin-top: 2px;
margin-left: 10px;
}
.owopfuck-smallbtn2 {
border: 2px solid #222324;
border-radius: 3px;
background: rgba(200, 200, 200, 0.01);
width: 40%;
height: 25px;
color: rgb(150, 150, 150);
font-size: 11.5px;
margin-bottom: 1px;
margin-top: 2px;
margin-left: 10px;
}
#owopfuck-topbar {
background-color: rgb(13, 15, 17);
height: 40px;
}
#window-owopfuck {
background-color: rgb(17, 19, 20);
width: 800px;
height: 590px;
}
.control {
display: block;
position: relative;
padding-left: 25px;
margin-bottom: 1px;
padding-top: 1px;
cursor: pointer;
font-size: 16px;
margin-left: 10px;
padding-bottom: 20px;
}
.control input {
position: absolute;
z-index: -1;
opacity: 0;
}
.control_indicator {
position: absolute;
top: 2px;
left: 0;
height: 18px;
width: 18px;
background: transparent;
border: 1px solid #222324;
border-radius: 3px;
}
.control:hover input ~ .control_indicator,
.control input:focus ~ .control_indicator {
background: rgba(255, 255, 255, 0.025);
}
.control input:checked ~ .control_indicator {
background: #4a59c8;
}
.control:hover input:not([disabled]):checked ~ .control_indicator,
.control input:checked:focus ~ .control_indicator {
background: #0e6647d;
}
.control input:disabled ~ .control_indicator {
background: #333f9e;
opacity: 1;
pointer-events: none;
}
.control_indicator:after {
box-sizing: unset;
content: '';
position: absolute;
display: none;
}
.control input:checked ~ .control_indicator:after {
display: block;
}
.control-checkbox .control_indicator:after {
left: 7px;
top: 3px;
width: 3px;
height: 8px;
border: solid #111314;
border-width: 0 2px 2px 0;
transform: rotate(45deg);
}
.control-checkbox input:disabled ~ .control_indicator:after {
border-color: #111314;
}
table[id^="owopfuck-"] {
border-collapse: collapse;
color: rgb(75 88 213);
text-align: center;
width: -webkit-fill-available;
border: solid 1px rgb(55, 55, 55);
font-family: 'pixel-op';
}
th[id^="owopfuck-bots"], td[id^="owopfuck-bots"] {
font-family: Verdana;
font-size: 12.5px;
padding: 2px;
text-align: center;
border-color: rgb(200, 200, 200);
border-width: 1px;
border-style: double;
border-right-style: none;
width: 110px;
border: solid 1px rgb(55, 55, 55);
}
tr[id^="owopfuck-"]:first-child {
text-align: center;
border: solid 1px rgb(55, 55, 55);
}`;
win.addObj(div);
win.addObj(styles);
win.addObj(tabsys);
}).move(165, 115));
addResizeableProperty("window-owopfuck", "window-owopfuck");
OWOP.windowSys.addWindow(new OWOP.windowSys.class.window("owopfuck info", {
closeable: false
}, function (win) {
const div = document.createElement("div");
let container = win.container;
container.id = 'window-owopfuck-info';
container.parentNode.firstChild.remove();
container.style = `overflow: hidden;
margin: 0 -5px -5px -5px;
-o-border-image: url(/img/window_in.png) 5 repeat;`;
container.classList = '';
container.parentNode.style["position"] = "absolute";
container.parentNode.style["pointer-events"] = "initial";
container.parentNode.style["background-color"] = "rgb(17, 19, 20)";
container.parentNode.style["border"] = "4px rgb(17, 19, 20) solid";
container.parentNode.style["width"] = "200px";
// container.parentNode.style["height"] = "80px";
// commented to make the height automatically set
div.innerHTML = `
`;
win.addObj(div);
}).move(105, window.innerHeight - 120));
OWOP.windowSys.addWindow(new OWOP.windowSys.class.window("owopfuck assets", {
closeable: false
}, function (win) {
const div = document.createElement("div");
let container = win.container;
container.parentNode.style.width = "260px";
container.parentNode.style.height = "500px";
container.id = 'window-owopfuck-assets';
container.parentNode.firstChild.remove();
container.style = `margin: 0 -5px -5px -5px;
-o-border-image: url(/img/window_in.png) 5 repeat;`;
container.classList = '';
container.parentNode.style["position"] = "absolute";
container.parentNode.style["pointer-events"] = "initial";
container.parentNode.style["background-color"] = "rgb(17, 19, 20)";
container.parentNode.style["border"] = "4px rgb(17, 19, 20) solid";
div.innerHTML = `
`;
win.addObj(div);
}).move(130, 200));
OWOP.windowSys.addWindow(new OWOP.windowSys.class.window("owopfuck jobs", {
closeable: false
}, function (win) {
const div = document.createElement("div");
let container = win.container;
container.parentNode.style.width = "260px";
container.parentNode.style.height = "500px";
container.id = 'window-owopfuck-assets';
container.parentNode.firstChild.remove();
container.style = `margin: 0 -5px -5px -5px;
-o-border-image: url(/img/window_in.png) 5 repeat;`;
container.classList = '';
container.parentNode.style["position"] = "absolute";
container.parentNode.style["pointer-events"] = "initial";
container.parentNode.style["background-color"] = "rgb(17, 19, 20)";
container.parentNode.style["border"] = "4px rgb(17, 19, 20) solid";
div.innerHTML = `
`;
win.addObj(div);
}).move(130, 200));
function createconfig() {
if (localStorage.OWOPFUCK) return;
let structure = {
vanish: false,
instaplace: false,
mppchat: false,
nohelp: false,
streamer: false,
diagfill: false,
assets: [],
wsproxy: [],
animations: {},
freebucket: 2,
animbuildmovement: false,
animbuildintms: 45,
animbuildbots: 10,
animbuildlwidth: 2,
animation: "Circle",
reconnectTime: 250,
eraserdiameter: 16,
livepredtime: true,
fakerank: false,
fakerank_prefix: "(A)",
animationtool: "Selected",
irc: true,
chatmentions: false,
guibind: "Insert",
ircbind: "RShift",
infogui: true,
language: "English",
botautoreconnect: false,
followid: "Disabled",
followbyid: false,
autoreconnect: false,
automalogin: false,
botcount: 2,
eraserpattern: "Horizontal",
areapattern: "Horizontal",
pastepattern: "Horizontal",
wolfmove: false,
smartsneaky: false,
follow: false,
bothighlight: false,
areahighlight: false,
areahighlightblink: false
};
localStorage.OWOPFUCK = JSON.stringify(structure);
};
createconfig();
const getStorage = () => JSON.parse(localStorage.OWOPFUCK || '{}');
function getValue(variable) {
let value = getStorage()[variable.toLowerCase()];
return typeof value === 'string' && value.includes('[') ? JSON.parse(value) : value;
};
function setValue(variable, value) {
let storage = getStorage();
storage[variable] = value;
localStorage.OWOPFUCK = JSON.stringify(storage);
return true;
};
let selectedAsset = null;
const refreshAssets = () => {
let assets = getValue("assets");
const assetsDiv = document.getElementById("owopfuck-assets-container");
assetsDiv.innerHTML = '';
for (let i in assets) {
const image = new Image();
image.onload = () => {
image.style.width = "96px";
image.style.height = "96px";
image.style.border = "solid 1px";
image.onclick = e => {
for (let j in document.getElementById("owopfuck-assets-container").children) {
if (typeof (document.getElementById("owopfuck-assets-container").children[j]) !== "object") break;
document.getElementById("owopfuck-assets-container").children[j].style.border = "solid 1px";
};
selectedAsset = assets[i];
image.style.border = "solid 1px red";
};
image.oncontextmenu = e => {
e.preventDefault();
assets.splice(i, 1);
setValue("assets", JSON.stringify(assets));
refreshAssets();
};
assetsDiv.append(image);
};
image.src = assets[i];
};
};
refreshAssets();
let last = 0;
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
const getFree = () => {
let b = bots.filter(i => i.net.ws.readyState === 1 && i.net.isWorldConnected);
if (b.length === 0) return -1;
if (last >= b.length) last = 0;
return last++;
};
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
};
function squareX(angle) {
let x = Math.sin(angle), y = Math.cos(angle);
return x / Math.max(Math.abs(x), Math.abs(y));
};
function squareY(angle) {
let x = Math.sin(angle), y = Math.cos(angle);
return y / Math.max(Math.abs(x), Math.abs(y));
};
function infinityX(t) {
let x = (Math.cos(t * 2) - 1) / 2;
if (Math.abs(t * 2) % (4 * Math.PI) > 2 * Math.PI) return -x;
else return x;
};
function infinityY(t) {
return Math.sin(t * 2) / 2;
};
function load(url, onload) {
let script = document.createElement('script');
script.src = url;
script.onload = onload;
document.head.appendChild(script);
};
function dist(x, y) {
return Math.sqrt(x * x + y * y);
};
OWOP.chat.recvModifier = (msg) => {
if (msg == 'Stop playing around with mod tools! :)') return;
return msg;
};
load("https://www.google.com/recaptcha/api.js");
// (auto) manual updater
fetch("https://scar17.scar17off.repl.co/owopfuck/version")
.then(data => {
return data.text();
}).then(data => {
if (data !== SCRIPT_VERSION) {
location.href = "https://scar17.scar17off.repl.co/owopfuck/script.js"; // i will force everyone to update owopfuck
};
});
document.getElementById("owopfuck-fakerank").addEventListener("input", () => {
const checked = document.getElementById("owopfuck-fakerank").checked;
if (checked) {
OWOP.chat.recvModifier = (msg) => {
if (msg == 'Stop playing around with mod tools! :)') return;
let temp = msg.split(':');
if ((temp[0].includes(OWOP.player.id.toString()) || temp[0].includes(localStorage.nick.toString())) && getValue("fakerank")) {
if (msg.startsWith("(M)") || msg.startsWith("(A)")) msg = msg.replace("(M) ", '').replace("(A) ", '');
msg = (document.getElementById("owopfuck-fakerank-prefix").value !== "User") ? `${document.getElementById("owopfuck-fakerank-prefix").value} ${msg.replace("[" + OWOP.player.id + "] ")}` : `[${OWOP.player.id}] ${localStorage.nick}: ${msg.replace("[" + OWOP.player.id.toString() + "] ", '').replace(localStorage.nick + ": ", '')}`;
// msg = `${document.getElementById("owopfuck-fakerank-prefix").value} ${msg.replace("["+OWOP.player.id+"] ")}`;
};
return msg;
};
for (var k in OWOP.tool.allTools) {
OWOP.tool.allTools[k].rankRequiredB = OWOP.tool.allTools[k].rankRequired;
// if(OWOP.tool.allTools[k].rankRequiredB === 3) console.log("admin " + k);
// if(OWOP.tool.allTools[k].rankRequiredB === 2) console.log("mod " + k);
OWOP.tool.allTools[k].rankRequired = 1;
OWOP.tool.updateToolbar();
};
} else {
OWOP.chat.recvModifier = (msg) => {
if (msg == 'Stop playing around with mod tools! :)') return;
return msg;
};
for (var k in OWOP.tool.allTools) {
OWOP.tool.allTools[k].rankRequired = OWOP.tool.allTools[k].rankRequiredB;
OWOP.tool.updateToolbar();
};
};
});
document.getElementById("owopfuck-asset-add").addEventListener("click", async () => {
let assets = getValue("assets");
assets.push(await upload("image/*"));
setValue("assets", JSON.stringify(assets));
refreshAssets();
});
var socket;
WebSocket.prototype.oldSend = WebSocket.prototype.send;
WebSocket.prototype.send = function (data) {
if (!socket && this.url !== "wss://botnet.scar17off.repl.co") socket = this;
if (getValue("vanish") && this === socket && this.url !== "wss://botnet.scar17off.repl.co") {
if (typeof data == "object") {
if (data.byteLength == 12) {
let dv = new DataView(data);
dv.setInt32(0, 0, true);
dv.setInt32(4, 0, true);
dv.setUint8(8, 0);
dv.setUint8(9, 0);
dv.setUint8(10, 0);
dv.setUint8(11, 0);
socket.oldSend(data);
} else {
this.oldSend(data);
};
};
} else {
this.oldSend(data);
};
};
document.getElementById("owopfuck-bothighlight").addEventListener("input", () => {
const checked = document.getElementById("owopfuck-bothighlight").checked;
if (checked) {
bots.forEach(bot => {
bot.highlight.move();
});
} else {
bots.forEach(bot => {
bot.highlight.shown = false;
bot.highlight.element.remove();
OWOP.removeListener(OWOP.events.tick, bot.highlight.move);
bot.highlight.move();
});
};
});
let ircServer;
function reconnectIRC() {
ircServer = io("wss://owopfuck-cc.scar17off.repl.co/");
try {
ircServer.on("message", (id, author, message) => displayIRCmessage(id, author, message));
ircServer.on("self", (id) => ircServer.id = id);
ircServer.on("users", (n) => owopfuck.infowindow.container.childNodes[0].childNodes[12].innerText = 'IRC users: ' + n);
} catch (error) {
};
};
function displayIRCmessage(id, author, message) {
if (id == ircServer.id) return;
OWOP.chat.local(`IRC [${id}] ${author}: ${message}`);
};
if (getValue("irc")) reconnectIRC();
document.getElementById("owopfuck-irc").addEventListener("input", () => {
if (!document.getElementById("owopfuck-irc").checked && ircServer) {
ircServer.close();
} else if (document.getElementById("owopfuck-irc").checked) {
reconnectIRC();
};
});
let chatInput = document.getElementById("chat-input");
chatInput.addEventListener("keydown", function (event) {
let key = event.key;
if (event.location === KeyboardEvent.DOM_KEY_LOCATION_RIGHT) key = "R" + key;
if (key == getValue("ircbind") && getValue("irc")) {
if (chatInput.value.startsWith("/nick ")) {
let nick = chatInput.value.replace("/nick ", '');
localStorage.ircnick = nick;
chatInput.value = '';
chatInput.style.height = "16px";
event.stopPropagation();
return;
};
if (chatInput.value.trimLeft().trimRight() == '') return;
OWOP.chat.local(`IRC [${ircServer.id}] ${localStorage.ircnick}: ${chatInput.value.replaceAll('<', '').replaceAll('>', '')}`);
ircServer.emit("send", chatInput.value, localStorage.ircnick);
chatInput.value = '';
chatInput.style.height = "16px";
event.stopPropagation();
};
});
const switchVisiblity = (window) => OWOP.windowSys.windows[window].container.parentNode.hidden = !OWOP.windowSys.windows[window].container.parentNode.hidden;
switchVisiblity("owopfuck assets");
switchVisiblity("owopfuck jobs");
switchVisiblity("owopfuck");
document.addEventListener("keydown", (E) => {
let key = E.key;
switch (key) {
case getValue("guibind"):
switchVisiblity("owopfuck");
break;
};
});
// needed to generate random proxy IP to bypass
function randomIP() {
return `${getRandomInt(1, 255)}.${getRandomInt(1, 255)}.${getRandomInt(1, 255)}.${getRandomInt(1, 255)}`;
};
// stolen from polybius
function protect(r, Q) {
let c = e => e.split('').map(h => h.charCodeAt(0));
let N = e => ('0' + Number(e).toString(16)).substr(-2);
let J = e => c(r).reduce((h, T) => h ^ T, e);
return Q.split('').map(c).map(J).map(N).join('');
};
// botnet
class BotNetReplicator {
constructor(zombie) {
this._events = {};
this.on = (event, fn) => {
if (!this._events[event]) this._events[event] = [];
this._events[event].push(fn);
};
this.once = (event, fn) => {
if (!this._events[event]) this._events[event] = [];
this._events[event].push([fn]);
};
this.emit = (event, ...args) => {
if (!this._events[event]) return;
for (let i in this._events[event])
if (typeof this._events[event][i] === "function") this._events[event][i](...args);
else {
this._events[event][i][0](...args);
this._events[event].splice(i, 1);
}
};
this.off = (event, fn) => {
if (!this._events[event]) return;
for (let i in this._events[event])
if (String(this._events[event][i]) === String(fn)) this._events[event].splice(i, 1);
}
this.readyState = 0;
botnet.on("message", (id, message) => {
if (id !== zombie) return;
this.emit("message", message);
});
botnet.on("status", (id, status) => {
if (id !== zombie) return;
if (status == "open") this.readyState = 1;
if (status == "close") this.readyState = 3;
this.emit(status);
});
this.send = (data) => {
botnet.emit("send", zombie, data);
};
this.close = () => {
botnet.emit("close", zombie);
};
};
};
const botnet = io("wss://botnet.scar17off.repl.co");
botnet.on("connect", () => {
botnet.emit("controller"); // mark current websocket as controller to not your ip
});
botnet.on("id", id => {
botnet.id = id;
});
const defaultBotnetHTML = document.getElementById("owopfuck-botsnet").innerHTML;
botnet.on("list", (list) => {
document.getElementById("owopfuck-botsnet").innerHTML = defaultBotnetHTML;
for (let i in list) {
let zombie = list[i];
let zombieTable = document.createElement("tr");
zombieTable.innerHTML = `${zombie.id.toString()} |
${zombie.ip} |
${(zombie.controller == botnet.id) ? "✅" : "❌"} |
| `;
zombieTable.id = `owopfuck-botnet-${zombie.sid}`;
document.getElementById("owopfuck-botsnet").appendChild(zombieTable);
if (zombie.controller == botnet.id) {
document.getElementById(`botnet-${zombie.sid}-control`).remove();
document.getElementById(`botnet-${zombie.sid}-connect`).addEventListener("click", () => {
botnet.emit("con", zombie.id, OWOP.options.serverAddress[0].url, "arraybuffer");
let options = {
index: bots.length + 1,
world: OWOP.world.name || undefined,
reconnect: getValue("botautoreconnect"),
reconnectTime: 250,
noLog: true,
adminlogin: getValue("automalogin") ? localStorage.adminlogin : undefined,
modlogin: getValue("automalogin") ? localStorage.modlogin : undefined,
captchapass: localStorage.owopcaptcha,
pass: localStorage.worldPasswords ? JSON.parse(localStorage.worldPasswords)[OWOP.world.name] : undefined,
zombie: zombie.id
};
var bot = new OJS.Client(options);
bot.on("close", () => {
bots.splice(bots.indexOf(bot), 1);
});
bot.on("connect", (id) => {
if (OWOP.player.id.toString() === id) return;
let playerOption = document.createElement("option");
playerOption.innerText = id.toString();
if (!Array.from(document.querySelector("*[name^=\"followid\"]").options).some(option => option.value === id))
document.querySelector("*[name^=\"followid\"]").options.add(playerOption);
});
bot.on("disconnect", (player) => {
for (let i in document.querySelector("*[name^=\"followid\"]").options) {
if (document.querySelector("*[name^=\"followid\"]").options[i].innerText === player.id.toString())
document.querySelector("*[name^=\"followid\"]").options.remove(i);
};
});
bots.push(bot);
});
} else {
document.getElementById(`botnet-${zombie.sid}-connect`).remove();
document.getElementById(`botnet-${zombie.sid}-control`).addEventListener("click", () => {
botnet.emit("control", zombie.id);
});
};
};
});
document.getElementById("botnet-controlall").addEventListener("click", () => {
document.getElementById("owopfuck-botsnet").childNodes.forEach((bot) => {
if (bot.id) bot.childNodes[6].childNodes[1].click();
});
});
// wsproxy
let onlineproxy = 0;
let ProxyPasswords = getValue('wsproxy');
let proxylist = {};
const defaultServersHTML = document.getElementById("owopfuck-wsproxy").innerHTML;
const updateServers = () => {
proxylist = {};
ProxyPasswords = getValue('wsproxy');
const servers = document.getElementById("owopfuck-wsproxy");
document.getElementById("owopfuck-wsproxy").innerHTML = defaultServersHTML;
for (let i in ProxyPasswords) {
const Proxy = ProxyPasswords[i].replace('\n', '');
let soc = `wss://${Proxy}.glitch.me/?ws=WS-STATUS`;
let site = `https://glitch.com/edit/#!/${Proxy}`;
let ico = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACOlBMVEUAAAD/dpj/dpj/dpj/dpj/dJf/dpj/d5f/d5f/eJf/eJf/eJb/eZb/j4L/dpj/dpf/dpj/epz/d5n5c5rkaaPlaaPvb5/+eJf/fZL/d5f/dpj/dpj/dpj3dJW9VLPYYqf5cpn/dZf/dZf/dpj5dpf/iK3+qtT+qdP+ver/x/L/x/DzufCqePa1gfTSnPL6wO//xe7/xe7+w+4AAP8tB/9GHf87DPUwBfokAP8UAP8FAP85Ef1PI/woAP8pA/dhIuBHEu4sAvwnAP8mAP8nAP8rBfgzHf9LU/9JUP9Xcv9cfv9bfP9bev9bev9aev9aeP9aeP9aeP9aef9aef9aef9aeP9aeP9aeP9aeP9aeP9ZeP9aeP9aeP9aeP9aeP9aeP9aeP9aeP9aeP9aeP9aeP9aeP9aeP9aeP/MXK/UYKvdZaehZHPkhpzrbKKmSb+vTbvVYarKXK/AVrO3Ubaoa3rjhJv1cZ6lS7/EWrL/eZf/eJf/fJ36hK3lerbCacXLbcH+hqv/rNT/q9L1pdW8i+Pcm9v/rdH/rNH/sdj/v+n+vun6u+z+verqsfHss/HervK5ivandvepd/dJH/1OI/phL/BhJ+dMFutFEu8/LqVLM+U4CvZ2L9VyLNhQGOpZHOViIuBpJtxGN6NONeEyBvt5MdVdIOMoCf8wGf8xGv84HfxLKfJrPOFgNuYzGv9MU/9JUP9SU/yGb+xqYPRNXP9Xcv9Wcf9cdfxYcv9mf/5hff5aef9aeP////+BcnYeAAAAaHRSTlMAFzQWAw4rPbPx1KBCAQEFUL/r8/7mlFskFkeLgPD84tX24tX+w3/3yy+S5v7rxoptq7cEUtj8w2wjEU6rgfD74tX14dX+w4D3yzCU2+bz++zJi26utwMcJGvn+ahoUS8QAQceBCxFGs5gm8UAAAABYktHRL091dJ5AAAAB3RJTUUH5ggcBx8tq7y1twAAAOdJREFUGNNjYMAKGJmYWRA8VjZ2Dk4ubh5eEIePgV9AUEhYJCMzS1RMXEJSSppBRjY7Jzcvv6CwqFhOXkFRiUFZpaS0rLyisqq6prauvkGVQU29sam5pbWtvaOzs6u7R4NBU0u7t69/wsRJOrp6+gaGRgzGJqaTp0ydNn2GmbmFpZW1DYOt3cxZs+fMnTd/wUJ7B0cnZwYX10WLlyxdtnzFylWr16xd58bg7rF+w8ZNm7ds3bp127btOzwZvLx9fP127tq9xz8gMCg4JJSBISw8IjIqOiY2Lj4hkSEpGeyblNS0dAZcAADzgEgQixaTYgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOC0yOFQwNzozMTo0NSswMDowMFFjl0UAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDgtMjhUMDc6MzE6NDUrMDA6MDAgPi/5AAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDIyLTA4LTI4VDA3OjMxOjQ1KzAwOjAwdysOJgAAAABJRU5ErkJggg==';
if (Proxy.includes(".")) {
let data = Proxy.split(".");
soc = `wss://${Proxy}.repl.co/?ws=WS-STATUS`;
site = `https://replit.com/@${data[1]}/${data[0]}`;
ico = 'data:image/png;base64,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';
};
let displayname = getValue("streamer") ? 'STREAMER MODE' : Proxy;
let proxytable = document.createElement("tr");
proxytable.id = `owopfuck-wsproxy-${Proxy}`;
proxytable.innerHTML = `
${displayname} |
❓ |
❓ |
❓ |
| `;
servers.appendChild(proxytable);
document.getElementById(`owopfuck-wsproxy-${Proxy}-delete`).onclick = () => {
ProxyPasswords = ProxyPasswords.filter(e => e !== Proxy);
delete proxylist[Proxy];
setValue('wsproxy', JSON.stringify(ProxyPasswords));
document.getElementById(`owopfuck-wsproxy-${Proxy}`).remove();
};
const WSCheck = new WebSocket(soc);
WSCheck.onopen = () => {
proxylist[Proxy] = {
connections: 0
};
onlineproxy++;
document.getElementById(`owopfuck-proxy-reconnect`).innerText = `Reconnect [ ${onlineproxy} / ${ProxyPasswords.length} ]`;
document.getElementById(`owopfuck-wsproxy-${Proxy}-status`).innerText = "✔️";
document.getElementById(`owopfuck-wsproxy-${Proxy}-connect`).onclick = () => {
proxyJoin(Proxy);
//document.getElementById(`owopfuck-proxy-reconnect-${Proxy}`).innerText = parseInt(document.getElementById(`owopfuck-proxy-reconnect-${Proxy}`).innerText) + 1;
};
document.getElementById(`owopfuck-wsproxy-${Proxy}-disconnect`).onclick = () => {
for (let i in bots) {
if (bots[i].clientOptions.proxy == Proxy) {
bots[i].ws.close();
bots = bots.filter(b => b.clientOptions.proxy == Proxy);
document.getElementById(`owopfuck-wsproxy-${Proxy}-online`).innerText = '0';
};
};
};
WSCheck.send("WS-STATUS");
};
WSCheck.onmessage = msg => {
document.getElementById(`owopfuck-wsproxy-${Proxy}-ip`).innerText = msg.data.split(",")[0];
if (WSCheck.url.includes(".glitch.me")) {
let connections = parseInt(msg.data.split(",")[1]) - 1
document.getElementById(`owopfuck-wsproxy-${Proxy}-online`).innerText = connections;
proxylist[Proxy].connections = connections;
};
WSCheck.close();
};
WSCheck.onerror = () => {
delete proxylist[Proxy];
if (onlineproxy > 0) onlineproxy -= 1;
document.getElementById(`owopfuck-wsproxy-${Proxy}-online`).innerText = '❌';
document.getElementById("owopfuck-proxy-reconnect").innerText = `Reconnect [ ${onlineproxy} / ${ProxyPasswords.length} ]`;
document.getElementById(`owopfuck-wsproxy-${Proxy}-status`).innerText = "❌";
};
};
};
if (ProxyPasswords.length !== 0) updateServers();
document.getElementById("owopfuck-nohelp").addEventListener("change", () => {
const val = document.getElementById("owopfuck-nohelp").checked;
var button = OWOP.elements.helpButton;
if (!button) button = OWOP.elements.hubButton
if (val) {
button.hidden = true;
} else {
button.hidden = false;
};
});
// totally not stolen from the masterbot client
document.getElementById("owopfuck-mppchat").addEventListener("change", () => {
const val = document.getElementById("owopfuck-mppchat").checked;
if (val) {
document.getElementById("chat").style.width = "inherit";
} else {
document.getElementById("chat").style.width = "";
};
});
window.bots = []; // allow to access the bots variable from console or third-party scripts
var bots = window.bots;
// SHIT CODE (PLEASE DONT READ IT)
let ranges = document.querySelectorAll(".owopfuck-range");
let ranges2 = document.querySelectorAll(".owopfuck-range2");
let checkboxes = document.querySelectorAll(".control, .control-checkbox");
let dropdowns = document.querySelectorAll(".owopfuck-dropdown");
let keybinds = document.querySelectorAll(".owopfuck-keyinput");
for (let i in ranges) {
if (Object.prototype.hasOwnProperty.call(ranges, i)) {
let range = ranges[i];
range.value = getValue(range.name);
document.getElementById("owopfuck-" + range.name + "-label").innerText = getValue(range.name);
range.addEventListener("input", () => {
setValue(range.name, parseInt(range.value));
document.getElementById("owopfuck-" + range.name + "-label").innerText = range.value.toString();
});
};
};
for (let i in ranges2) {
if (Object.prototype.hasOwnProperty.call(ranges2, i)) {
let range = ranges2[i];
range.value = getValue(range.name);
document.getElementById("owopfuck-" + range.name + "-input").value = getValue(range.name);
range.addEventListener("input", () => {
setValue(range.name, parseInt(range.value));
document.getElementById("owopfuck-" + range.name + "-input").value = range.value;
});
document.getElementById("owopfuck-" + range.name + "-input").addEventListener("input", () => {
setValue(range.name, parseInt(document.getElementById("owopfuck-" + range.name + "-input").value));
range.value = document.getElementById("owopfuck-" + range.name + "-input").value;
});
};
};
for (let i in checkboxes) {
if (Object.prototype.hasOwnProperty.call(checkboxes, i)) {
let checkbox = checkboxes[i].querySelector("input");
checkbox.checked = getValue(checkbox.name);
checkbox.addEventListener("change", () => {
setValue(checkbox.name, checkbox.checked);
});
var event = new Event('change', {
bubbles: true,
cancelable: true,
});
checkbox.dispatchEvent(event);
};
};
for (let i in dropdowns) {
if (Object.prototype.hasOwnProperty.call(dropdowns, i)) {
let dropdown = dropdowns[i];
// dropdown.value = getValue(dropdown.name);
dropdown.addEventListener("input", () => {
setValue(dropdown.name, dropdown.value);
});
};
};
for (let i in keybinds) {
if (Object.prototype.hasOwnProperty.call(keybinds, i)) {
let keybind = keybinds[i];
keybind.value = getValue(keybind.name);
keybind.addEventListener("keydown", (event) => {
let key = event.key;
if (event.location === KeyboardEvent.DOM_KEY_LOCATION_RIGHT) key = "R" + key;
document.getElementById(keybind.id).value = key;
setTimeout(() => setValue(keybind.name, key), 300);
});
};
};
// patterns
load("https://scar17.scar17off.repl.co/helpers/patterns.js", () => {
for (const key in constants) {
if (constants.hasOwnProperty(key)) document.querySelector("*[name^='eraserpattern']").add(new Option(key, window.constants[key]));
if (constants.hasOwnProperty(key)) document.querySelector("*[name^='areapattern']").add(new Option(key, window.constants[key]));
if (constants.hasOwnProperty(key)) document.querySelector("*[name^='pastepattern']").add(new Option(key, window.constants[key]));
};
for (let i in dropdowns) {
if (Object.prototype.hasOwnProperty.call(dropdowns, i)) {
let dropdown = dropdowns[i];
dropdown.value = getValue(dropdown.name);
};
};
});
const proxyJoin = server => {
if (typeof server !== 'string') return;
proxylist[server].connections++;
let bot = new OJS.Client({
index: bots.length + 1,
proxy: server,
world: OWOP.world.name || undefined,
reconnect: getValue("botautoreconnect"),
reconnectTime: 250,
noLog: true,
adminlogin: getValue("automalogin") ? localStorage.adminlogin : undefined,
modlogin: getValue("automalogin") ? localStorage.modlogin : undefined,
captchapass: localStorage.owopcaptcha,
pass: localStorage.worldPasswords ? JSON.parse(localStorage.worldPasswords)[OWOP.world.name] : undefined,
ws: new WebSocket(OWOP.options.serverAddress[0].url, null, {
headers: {
'Origin': (location.host !== "ourworldofpixels.com") ? location.origin : "https://ourworldofpixels.com",
'Referer': (location.host !== "ourworldofpixels.com") ? document.referrer : "https://ourworldofpixels.com/"
},
origin: (location.host !== "ourworldofpixels.com") ? location.origin : "https://ourworldofpixels.com"
})
});
bot.on("close", () => {
bots.splice(bots.indexOf(bot), 1);
});
bot.on("connect", (id) => {
if (OWOP.player.id.toString() === id) return;
let playerOption = document.createElement("option");
playerOption.innerText = id.toString();
if (!Array.from(document.querySelector("*[name^=\"followid\"]").options).some(option => option.value === id))
document.querySelector("*[name^=\"followid\"]").options.add(playerOption);
});
bot.on("disconnect", (player) => {
for (let i in document.querySelector("*[name^=\"followid\"]").options) {
if (document.querySelector("*[name^=\"followid\"]").options[i].innerText === player.id.toString())
document.querySelector("*[name^=\"followid\"]").options.remove(i);
};
});
bots.push(bot);
};
document.getElementById("owopfuck-proxy-input").addEventListener("keydown", (event) => {
if (event.key == "Enter") {
let proxyname = document.getElementById("owopfuck-proxy-input").value;
let old = getValue("wsproxy");
if (old.indexOf(proxyname) == -1) old.push(proxyname);
setValue("wsproxy", old);
updateServers();
document.getElementById("owopfuck-proxy-input").value = '';
};
});
document.getElementById("owopfuck-proxy-reconnect").addEventListener("click", () => {
updateServers();
});
document.getElementById("owopfuck-connect").addEventListener("click", async () => {
for (let i = 0; i < getValue("botcount"); i++) {
let options = {
index: bots.length + 1,
world: OWOP.world.name || undefined,
reconnect: getValue("botautoreconnect"),
reconnectTime: 250,
noLog: true,
adminlogin: getValue("automalogin") ? localStorage.adminlogin : undefined,
modlogin: getValue("automalogin") ? localStorage.modlogin : undefined,
captchapass: localStorage.owopcaptcha,
pass: localStorage.worldPasswords ? JSON.parse(localStorage.worldPasswords)[OWOP.world.name] : undefined,
ws: new WebSocket(OWOP.options.serverAddress[0].url, null, {
headers: {
'Origin': (location.host !== "ourworldofpixels.com") ? location.origin : "https://ourworldofpixels.com",
'Referer': (location.host !== "ourworldofpixels.com") ? document.referrer : "https://ourworldofpixels.com/"
},
origin: (location.host !== "ourworldofpixels.com") ? location.origin : "https://ourworldofpixels.com"
})
};
var bot = new OJS.Client(options);
bot.on("close", () => {
bots.splice(bots.indexOf(bot), 1);
});
bot.on("connect", (id) => {
if (OWOP.player.id.toString() === id) return;
let playerOption = document.createElement("option");
playerOption.innerText = id.toString();
if (!Array.from(document.querySelector("*[name^=\"followid\"]").options).some(option => option.value === id))
document.querySelector("*[name^=\"followid\"]").options.add(playerOption);
});
bot.on("disconnect", (player) => {
for (let i in document.querySelector("*[name^=\"followid\"]").options) {
if (document.querySelector("*[name^=\"followid\"]").options[i].innerText === player.id.toString())
document.querySelector("*[name^=\"followid\"]").options.remove(i);
};
});
bots.push(bot);
};
});
document.getElementById("owopfuck-clear-jobs").addEventListener("click", () => {
const buttons = document.querySelectorAll("[id$='-stopbtn']");
buttons.forEach(button => {
button.click();
});
owopfuck.infowindow.container.childNodes[0].childNodes[3].innerText = "Time remaining: no job";
});
document.getElementById("animbuilder-add").addEventListener("click", () => {
let name = document.getElementById("animbuilder-name").value;
if (name == '') return;
let animations = getValue("animations");
animations[name] = [document.getElementById("animbuilder-x-expression").value, document.getElementById("animbuilder-y-expression").value];
setValue("animations", animations);
document.getElementById("animbuilder-name").value = '';
const optionElement_1 = document.createElement("option");
optionElement_1.text = name;
const optionElement_2 = document.createElement("option");
optionElement_2.text = name;
document.querySelector('select[name="animation"]').options.add(optionElement_1);
document.getElementById("animbuilder-animations").options.add(optionElement_2);
});
document.getElementById("animbuilder-remove").addEventListener("click", () => {
let name = document.getElementById("animbuilder-animations").value;
let animations = getValue("animations");
delete animations[name];
setValue("animations", animations);
for (let i in document.querySelector('select[name="animation"]').options) {
if (document.querySelector('select[name="animation"]').options[i].innerText === name)
document.querySelector('select[name="animation"]').options.remove(i);
};
for (let i in document.getElementById("animbuilder-animations").options) {
if (document.getElementById("animbuilder-animations").options[i].innerText === name)
document.getElementById("animbuilder-animations").options.remove(i);
};
});
document.getElementById("owopfuck-disconnect").addEventListener("click", () => {
bots.forEach(bot => {
bot.highlight.element.remove();
bot.world.destroy();
});
document.getElementById("owopfuck-bots").innerHTML = defaultBotnetHTML;
});
document.getElementById("owopfuck-chat-send").addEventListener("click", () => {
const value = document.getElementById("owopfuck-chat-msg").value;
for (let i in bots) bots[i].chat.send(value);
});
OWOP.on(events.net.disconnected, () => {
if (getValue("autoreconnect")) {
setTimeout(function () {
document.getElementById("reconnect-btn").click();
}, 100);
};
});
let PI2 = 3 * Math.PI,
FOLLOWADD = PI2 / 45,
f = 0,
x, y,
folint,
x1, y1,
f1 = 0,
pos = {};
let spiral = {
step: 0,
PI2: 2 * Math.PI,
speed: () => ((2 * Math.PI) / 30 / bots.length),
radius: (i) => i * 3
};
document.getElementById("owopfuck-follow").addEventListener("change", () => {
if (!getValue("follow")) {
clearInterval(folint);
return;
};
folint = setInterval(() => {
if (typeof pos !== "object") return;
if (getFree() === -1) return;
if (getValue("followid") == "Disabled") {
pos = {
x: OWOP.mouse.tileX,
y: OWOP.mouse.tileY
};
} else {
let playerID = document.querySelector("*[name^=\"followid\"]").selectedOptions[0].innerText;
if (bots[0].players[playerID]) pos = {
x: bots[0]?.players[playerID].x,
y: bots[0]?.players[playerID].y
}
else pos = {
x: OWOP.mouse.tileX,
y: OWOP.mouse.tileY
};
};
let length = bots.length;
let radius = bots.length;
let i = bots.length;
let animation = getValue("animation");
let animations = getValue("animations");
while (i--) {
if (getFree() === -1) return;
// animation builder
if (animations[animation]) {
let xfunc = createExpressionFunction(animations[animation][0]);
let yfunc = createExpressionFunction(animations[animation][1]);
x = xfunc(pos, length, i, f);
y = yfunc(pos, length, i, f);
};
if (animation == "Circle") {
x = pos.x + (Math.cos(2 * Math.PI * 2 / length * i + f) * length);
y = pos.y + (Math.sin(2 * Math.PI * 2 / length * i + f) * length);
};
if (animation == "Circle 2") {
x = pos.x + (Math.cos(2 / Math.PI * 2 / length * i + f) * length);
y = pos.y + (Math.sin(2 / Math.PI * 2 / length * i + f) * length);
};
if (animation == "Expanding circle") {
x = pos.x + Math.cos(2 * Math.PI * 2 / length * i + f) * length * (1 + Math.sin(f));
y = pos.y + Math.sin(2 * Math.PI * 2 / length * i + f) * length * (1 + Math.sin(f));
};
if (animation == "Spinning circle") {
x = pos.x + Math.cos(2 * Math.PI * 2 / length * i + f) * length * (Math.sin(f));
y = pos.y + (Math.sin(2 * Math.PI * 2 / length * i + f) * length);
};
if (animation == "Wave 2") {
x = pos.x + (Math.cos(2 * Math.PI * 0 / length * i + f + 4) * i);
y = pos.y + (Math.sin(2 * Math.PI * 2 / length * i + f - 2) * length);
};
if (animation == "Wave 3") {
x = pos.x + (Math.cos(2 * Math.PI * 2 / length * (i + f)) - i);
y = pos.y + (Math.sin(2 * Math.PI * 2 / length * i + f) * length);
};
if (animation == "Wave 4") {
x = pos.x + (Math.cos(1 * Math.PI * 2 / length * i + f) * length);
y = pos.y + (Math.sin(3 * Math.PI * i - f) * i);
};
if (animation == "Wave 5") {
x = pos.x + (Math.cos(.5 * Math.PI * 2 / length * i + f) * length);
y = pos.y + (Math.sin(1 * Math.PI * i - f) * i);
};
if (animation == "Wave 6") {
x = pos.x + (Math.cos(0.1 * Math.PI * 2 / length * i + f) * length);
y = pos.y + (Math.sin(1 * Math.PI * i - f) * i);
};
if (animation == "Wave 7") {
x = pos.x + Math.cos(f + 2 * Math.PI * i / 4) * length;
y = pos.y + Math.cos(f) * Math.sin(2 * Math.PI * i / 5) * length;
};
if (animation == "Spinning line") {
x = pos.x + (Math.cos(2 * Math.PI * 2 * i + f) * i);
y = pos.y + (Math.sin(2 * Math.PI * 2 * i - f) * i);
};
if (animation == "Paralelpipedum") {
x = pos.x + (Math.cos(2 * Math.PI * 3 / length * i + f) * length);
y = pos.y + (Math.sin(2 * Math.PI * 2 / length * i + f - 2) * length);
};
if (animation == "Rhombus") {
x = pos.x + Math.sin(f) * Math.pow(Math.sin(f), 2) * length;
y = pos.y + Math.cos(f) * Math.pow(Math.cos(f), 2) * length;
};
if (animation == "Vertical Sector Circle") {
x = pos.x + Math.sin(f) * Math.cos(2 * Math.PI * i / 4) * length;
y = pos.y + Math.cos(f) * Math.pow(Math.abs(Math.cos(f)), 0) * length;
};
if (animation == "Horizontal Sector Circle") {
x = pos.x + Math.cos(f + 2 * Math.PI * i / 4) * length;
y = pos.y + Math.cos(f) * Math.sin(2 * Math.PI * i / 4) * length;
};
if (animation == "Cross") {
x = pos.x + Math.sin(f) * Math.cos(2 * Math.PI * i / 4) * length;
y = pos.y + Math.cos(f) * Math.sin(2 * Math.PI * i / 4) * length;
};
if (animation == "Rect Random") {
x = pos.x + Math.sin(f) * Math.random() * length;
y = pos.y + Math.cos(f) * Math.random() * length;
};
if (animation == "Cobra") {
x = pos.x + (Math.cos(1 * Math.PI * 1 / length * i + f) * i);
y = pos.y + (Math.sin(2 * Math.PI * 4 / length * i + f) * f * i / 8);
};
if (animation == "Piramid") {
x = pos.x + (Math.sin(5 + Math.PI * Math.PI / i * length + f + Math.PI / 2) * i);
y = pos.y + (Math.sin(5 + Math.PI * Math.PI / i * i + length) * i);
};
if (animation == "Xray") {
x = pos.x + (Math.sin(1 + Math.PI * i + f) * length);
y = pos.y + (Math.sin(2 * Math.PI * 3 / length * i + f) * length);
};
if (animation == "Disk") {
x = pos.x + (Math.cos(2 * Math.PI * 2 / length * i + f * 2) * length);
y = pos.y + (Math.sin(2 * Math.PI * 2 / length * i + f) * length);
};
if (animation == "Atom") {
if (i >= bots.length / 2) {
x = pos.x + (Math.cos(2 * Math.PI * 2 / bots.length * i + f) * bots.length / 2);
y = pos.y + (Math.sin(2 * Math.PI * 2 / bots.length * i + f + 2) * bots.length / 2);
} else {
x = pos.x + (Math.cos(2 * Math.PI * 2 / bots.length * i + f + 2) * bots.length / 2);
y = pos.y + (Math.sin(2 * Math.PI * 2 / bots.length * i + f) * bots.length / 2);
};
};
if (animation == "Random") {
x = pos.x - (length / 2) + Math.floor(Math.random() * length);
y = pos.y - (length / 2) + Math.floor(Math.random() * length);
};
if (animation == "Random 2") {
x = pos.x + (Math.cos(0.1 * Math.PI * Math.random() ^ 50 / length * i + f) * length);
y = pos.y + (Math.sin(0.1 * Math.PI * 2 / length * i + f) * length);
};
if (animation == "Random TB") {
x = pos.x + (Math.cos(2 - length * i - f) * length);
y = pos.y + (Math.sin(2 / length * i + f) * length);
};
if (animation == "Wave") {
x = pos.x + (Math.cos(2 * Math.PI / length * i + f) * length);
y = pos.y + (Math.sin(2 * Math.PI * 2 / length * i + f) * length);
};
if (animation == "Right - Left") {
x = pos.x + (Math.cos(2 * Math.PI * 2 ** length * i + f) * length);
y = pos.y + (Math.sin(2 * Math.PI * 2 / length * i + f) * length);
};
if (animation == "Bot Line") {
x = pos.x + i;
y = pos.y;
};
if (animation === "Bot Line 2") {
x = pos.x + (Math.cos(2 * Math.PI * 2 / length * i + f) * length);
y = pos.y + (Math.sin(5 * Math.PI * 0.1 ^ 5 / length * i + f) * length);
};
if (animation === "Snake") {
x = pos.x + (Math.ceil(2 * Math.PI * 2 / length * i + f) * length) / 5; // 5 is snake length
y = pos.y + (Math.cos(1 * Math.PI * 2 / length * i + f) * length / 2) / 2;
};
if (animation === "Snake 2") {
x = pos.x + (Math.floor(2 * Math.PI * 2 / length * i + f) * length);
y = pos.y + (Math.cos(2 * Math.PI * 2 / length * i + f) * length);
};
if (animation === "Random lines") {
x = pos.x + (Math.cos(5 * Math.PI * 2 / length * i + f ^ 2 * 1) * i);
y = pos.y + (Math.sin(2 * Math.PI * 2 / length * i + f) * length);
};
if (animation === "Multiple Top - Bottom") {
x = pos.x + (Math.cos(5 * Math.PI * 2 / length * i + f) * length);
y = pos.y + (Math.sin(5 / 45 * Math.PI * 2 / length * i + f) * length);
};
if (animation == "X") {
let r = 2 * Math.PI * 2 / length * i + f;
if (i % 2 == 0) {
let s = Math.sin(r);
y = pos.y + (Math.cos(r) * 3 + 15 * s);
x = pos.x + (s * 15 + 3 * s);
} else {
let c = Math.cos(r)
x = pos.x + (c * 8 + 9 * c);
y = pos.y + (Math.sin(r) * 3 + -15 * c);
};
};
if (animation == "Spiral") {
let speed = spiral.speed();
let radius = spiral.radius(i);
x = Math.cos(Math.PI / length * i + spiral.step) * radius;
y = Math.sin(Math.PI / length * i + spiral.step) * radius;
x += pos.x;
y += pos.y;
spiral.step += speed;
spiral.step %= spiral.PI2;
};
if (animation == "Top - Bottom") {
x = pos.x + (Math.sin(2 * Math.PI * 2 / length * i + f) * length);
y = pos.y + (Math.cos(2 * Math.PI * 2 ** length * i + f) * length);
};
if (animation == "Eight") {
x = pos.x + (Math.sin(10 * Math.PI / length * i * f) * length / 1.768);
y = pos.y + (Math.cos(5 * Math.PI / length * i * f) * length / 1.768);
};
if (animation == "3D") {
if (i >= length / 2) {
y = pos.y + Math.cos(2 * Math.PI / bots * i + f) * 40;
x = pos.x + Math.sin(2 * Math.PI * 2 / bots * i + f) * 40;
} else {
x = pos.x + (Math.cos(2 * Math.PI * 4 / 4.09 * i + f * 2.5) * 9);
y = pos.y + (Math.sin(2 * Math.PI * 2 / 4.09 * i + f) * 9);
};
};
if (animation == "Infinity") {
a = spiral.PI2 / bots[i].length * i + f;
x = pos.x + infinityX(f / 20 * i + f) * 40;
y = pos.y + infinityY(f / 20 * i + f) * 40;
};
if (animation == "Infinity 2") {
a = spiral.PI2 / bots[i].length * i + f;
x = pos.x + infinityX(f / 20 * i + f) * 40;
y = pos.y + infinityY(f / 20 * i + f) * 40;
};
if (animation == "Square") {
a = spiral.PI2 / bots[i].length * i + f;
x = pos.x + squareX(f / 40 * i + f) * length / 1.285;
y = pos.y + squareY(f / 40 * i + f) * length / 1.285;
};
if (animation == "Triagle") {
let t = Math.PI * 2 / length * i + f;
x = pos.x + (2 * Math.sin(t) + Math.sin(2 * (t))) * length / 2;
y = pos.y + (2 * Math.cos(t) - Math.cos(2 * (t))) * length / 2;
};
if (animation == "Storm") {
let t = Math.PI * 2 / length * i - f;
let t1 = Math.PI * 3 / length * i + f;
x1 = pos.x + (Math.cos(2 * t) * length);
y1 = pos.y + (Math.sin(2 * t) * length);
x = x1 + (Math.cos(3 * t) * length);
y = y1 + (Math.sin(3 * t) * length);
};
if (animation == "Copy Disk") {
let t = Math.PI * 2 / length * i + f;
let t1 = Math.PI / length * i + f;
x = pos.x + (2 * Math.sin(t) + Math.sin(2 * t1)) * length / 2;
y = pos.y + (2 * Math.cos(t) - Math.cos(2 * t1)) * length / 2;
};
if (animation == "Disk X") {
let t = Math.PI * 2 / length * i + f;
let t1 = Math.PI * 2 / length * i - f;
if (i % 2 == 0) {
x = pos.x + (Math.cos(t) * (length * 1.5));
y = pos.y + (Math.sin(t1) * (length * 1.5));
} else {
x = pos.x + (Math.cos(t1) * (length));
y = pos.y + (Math.sin(t) * (length));
};
};
if (animation == "Asshole") {
let t = Math.PI * 2 / length * i - f;
let t1 = Math.PI * 2 / length * i + (f * 2);
x1 = pos.x + (Math.cos(t1) * length);
y1 = pos.y + (Math.sin(t1) * length);
x = x1 + (Math.cos(t) * length);
y = y1 + (Math.sin(t) * length);
};
if (animation == "Smooth Disk") {
let t = Math.PI * 2 / length * i - f;
let t1 = Math.PI * 2 / length * i + f;
x1 = pos.x + (Math.cos(t1) * length);
y1 = pos.y + (Math.sin(t) * length);
x = x1 + (Math.cos(t) * length);
y = y1 + (Math.sin(t) * length);
};
if (animation == "50% Disk") {
let t = Math.PI * 2 / length * i - f;
let t1 = Math.PI * 2 / length * i + f;
x1 = pos.x + (Math.cos(t1) * length);
y1 = pos.y + (Math.sin(t) * length);
x = x1 + (Math.cos(t1) * length);
y = y1 + (Math.sin(t) * length);
};
if (animation == "Lasso") {
let t = Math.PI * 2 / length * i - f;
let t1 = Math.PI * 2 / length * i + f;
let t2 = Math.PI * 3 / length * i * (f / length);
x1 = pos.x + (Math.cos(t1) * length);
y1 = pos.y + (Math.sin(t) * length);
x = x1 + (Math.cos(t) * length);
y = y1 + (Math.sin(t2) * length);
};
if (animation == "Smooth Disk 2") {
let t = Math.PI * 2 / length * i - f;
let t1 = Math.PI * 2 / length * i + f;
let t2 = Math.PI * 3 / length * 10 * (f / length);
x1 = pos.x + (Math.cos(t2) * length);
y1 = pos.y + (Math.sin(t1) * length);
x = x1 + (Math.cos(t) * length);
y = y1 + (Math.sin(t) * length);
};
if (animation == "卐") {
let t = Math.PI * 2 / length * i + f;
if (i == 1) {
x = pos.x + 5;
y = pos.y + 1;
} else if (i == 2) {
x = pos.x + 4;
y = pos.y + 1;
} else if (i == 3) {
x = pos.x + 3;
y = pos.y + 1;
} else if (i == 4) {
x = pos.x + 3;
y = pos.y + 2;
} else if (i == 5) {
x = pos.x + 3;
y = pos.y + 3;
} else if (i == 6) {
x = pos.x + 3;
y = pos.y + 4;
} else if (i == 7) {
x = pos.x + 3;
y = pos.y + 5;
} else if (i == 8) {
x = pos.x + 1;
y = pos.y + 1;
} else if (i == 9) {
x = pos.x + 1;
y = pos.y + 2;
} else if (i == 10) {
x = pos.x + 1;
y = pos.y + 3;
} else if (i == 11) {
x = pos.x + 2;
y = pos.y + 3;
} else if (i == 12) {
x = pos.x + 4;
y = pos.y + 3;
} else if (i == 13) {
x = pos.x + 5;
y = pos.y + 3;
} else if (i == 14) {
x = pos.x + 5;
y = pos.y + 4;
} else if (i == 15) {
x = pos.x + 5;
y = pos.y + 5;
} else if (i == 16) {
x = pos.x + 1;
y = pos.y + 5;
} else if (i == 17) {
x = pos.x + 2;
y = pos.y + 5;
} else if (i == 18) {
x = pos.x + 3;
y = pos.y + 5;
} else {
let t = Math.PI * 2 / (length - 18) * (i - 18) + f;
x = pos.x + 3 + (Math.cos(t) * ((length - 18) * 1));
y = pos.y + 3 + (Math.sin(t) * ((length - 18) * 1));
};
};
bots[i].world.move(x, y);
if (getValue("paintfollow")) bots[i].world.setPixel(x, y, OWOP.player.selectedColor);
let tools = {
id: {
'cursor': 0,
'move': 1,
'pipette': 2,
'eraser': 3,
'zoom': 4,
'fill': 5,
'paste': 6,
'export': 7,
'line': 8,
'protect': 9,
'copy': 10
},
0: 'cursor',
1: 'move',
2: 'pipette',
3: 'eraser',
4: 'zoom',
5: 'fill',
6: 'paste',
7: 'export',
8: 'line',
9: 'protect',
10: 'copy'
};
let tool;
if (getValue("animationtool") == 'Selected') tool = tools.id[OWOP.player.tool.id];
if (getValue("animationtool") == 'Random') {
let rank = bots[i].player.rank;
if (rank == 1) {
let toolList = [0, 1, 2, 4, 5, 7, 8];
tool = getRandomItemFromArray(toolList);
} else if (rank > 1) {
let toolList = [0, 1, 2, 4, 5, 7, 8, 3, 6, 9, 10];
tool = getRandomItemFromArray(toolList);
};
} else if (getValue("animationtool") !== 'Selected' && getValue("animationtool") !== 'Random') tool = tools.id[getValue("animationtool").toLowerCase()];
bots[i].world.setTool(tool);
};
if (animation == "Infinity") {
FOLLOWADD = PI2 / 100;
f = (f + FOLLOWADD);
} else if (animation == "Infinity 2") {
FOLLOWADD = PI2 / 95;
f = (f + FOLLOWADD);
} else if (animation == "Eight") {
FOLLOWADD = PI2 / 500;
f = (f + FOLLOWADD) % PI2;
} else {
f = (f + FOLLOWADD - .5) % PI2;
};
}, 90);
});
{
let animationOptions = getValue("animations");
for (let i in animationOptions) {
const optionElement_1 = document.createElement("option");
optionElement_1.text = i;
const optionElement_2 = document.createElement("option");
optionElement_2.text = i;
document.querySelector('select[name="animation"]').options.add(optionElement_1);
document.getElementById("animbuilder-animations").options.add(optionElement_2);
};
const cvs_2 = document.getElementById("animbuilder-canvas");
const ctx_2 = cvs_2.getContext("2d");
const xexpr = document.getElementById("animbuilder-x-expression");
const yexpr = document.getElementById("animbuilder-y-expression");
const movement_toggle = document.getElementById("owopfuck-animbuilder-movement");
let animationInterval = null;
const bot_poses = [];
const defaultExpression = `pos.x + (Math.cos(2 * Math.PI * 2 / length * i + f) * length);
pos.y + (Math.sin(2 * Math.PI * 2 / length * i + f) * length);`;
let mathexpressions = defaultExpression;
xexpr.value = defaultExpression.split("\n")[0];
yexpr.value = defaultExpression.split("\n")[1];
function updateExpression() {
mathexpressions = xexpr.value + "\n" + yexpr.value;
xfunc = createExpressionFunction(mathexpressions.split("\n")[0]);
yfunc = createExpressionFunction(mathexpressions.split("\n")[1]);
clearCanvas();
};
xexpr.addEventListener("input", updateExpression);
yexpr.addEventListener("input", updateExpression);
cvs_2.addEventListener('mousedown', mouse => {
if (mouse.button === 1) {
const imageDataUrl = cvs.toDataURL();
const image = new Image();
image.src = imageDataUrl;
image.onload = function () {
const canvasElement = document.createElement('canvas');
canvasElement.width = image.width;
canvasElement.height = image.height;
const context = canvasElement.getContext('2d');
context.drawImage(image, 0, 0);
canvasElement.toBlob(blob => {
navigator.clipboard.write([
new ClipboardItem({
[blob.type]: blob
})
]);
});
};
};
});
document.getElementById("owopfuck-animbuildintms").addEventListener("input", () => {
clearInterval(animationInterval);
clearCanvas();
createInterval();
});
document.getElementById("animbuilder-animations").addEventListener("change", () => {
const name = document.getElementById("animbuilder-animations").value;
let animations = getValue("animations");
const animation = animations[name];
document.getElementById("animbuilder-x-expression").value = animation[0];
document.getElementById("animbuilder-y-expression").value = animation[1];
// redraw after loading
updateExpression();
});
document.querySelectorAll('input[name^="animbuild"][type="range"]').forEach(input => {
input.addEventListener("input", () => {
input.parentNode.children[0].innerText = input.parentNode.children[0].innerText.replace(/\d+/g, input.value);
clearCanvas();
});
});
movement_toggle.addEventListener("change", () => {
clearCanvas();
});
document.getElementById("owopfuck-animationbuilder-bots").addEventListener("input", () => {
xfunc = createExpressionFunction(mathexpressions.split("\n")[0]);
yfunc = createExpressionFunction(mathexpressions.split("\n")[1]);
});
document.getElementById("animbuilder-redraw").addEventListener("click", () => {
clearCanvas();
});
document.getElementById("animbuilder-reset").addEventListener("click", () => {
xexpr.value = "pos.x + (Math.cos(2 * Math.PI * 2 / length * i + f) * length);";
yexpr.value = "pos.y + (Math.sin(2 * Math.PI * 2 / length * i + f) * length);";
mathexpressions = xexpr.value + "\n" + yexpr.value;
xfunc = createExpressionFunction(mathexpressions.split("\n")[0]);
yfunc = createExpressionFunction(mathexpressions.split("\n")[1]);
clearCanvas();
});
async function copyContent(text) {
try {
await navigator.clipboard.writeText(text);
} catch (err) {
console.error('Failed to copy: ', err);
};
};
document.getElementById("animbuilder-copy").addEventListener("click", () => {
copyContent(mathexpressions);
});
function clearCanvas() {
ctx_2.clearRect(0, 0, cvs_2.width, cvs_2.height);
};
let PI2_2 = 3 * Math.PI,
FOLLOWADD_2 = PI2_2 / 45,
f_2 = 0;
window.animbuilderCenter = {
x: cvs_2.width / 2,
y: cvs_2.height / 2
};
let xfunc = createExpressionFunction(mathexpressions.split("\n")[0]);
let yfunc = createExpressionFunction(mathexpressions.split("\n")[1]);
function createInterval() {
animationInterval = setInterval(() => {
if (movement_toggle.checked) clearCanvas();
let bots = getValue("animbuildbots") * 8 - 1;
let length = bots;
for (let i = bots; i >= 0; i--) {
const x = xfunc(animbuilderCenter, length, i, f_2);
const y = yfunc(animbuilderCenter, length, i, f_2);
if (movement_toggle.checked) bot_poses[i] = [x, y];
ctx_2.fillStyle = "#5666f2";
let width = getValue("animbuildlwidth");
ctx_2.fillRect(x, y, width, width);
};
f_2 = (f_2 + FOLLOWADD_2 - 0.5) % PI2_2;
}, getValue("animbuildintms"));
};
createInterval();
};
OWOP.world.protection = {
intervals: {},
pixels: {},
chunks: []
};
let protection_queue = [];
let pixbusu = false;
async function placePixel(x, y, color, item, abc) {
await pixbusu == true;
if (abc === -1 || typeof abc == "undefined") {
abc = getFree();
};
if (abc == -1) {
pixbusu = false;
return;
};
let setpixel = bots[abc].world.setPixel;
if (item) setpixel = bots[abc].world[item];
if (!setpixel) return;
if (!eq(OWOP.world.getPixel(x, y), color)) {
bots[abc].net.bucket.canSpend(0);
if (bots[abc].net.bucket.allowance >= getValue("freebucket")) {
setpixel(x, y, color);
pixbusu = false;
} else {
pixbusu = false;
await placePixel(x, y, color, item, abc);
return;
};
};
pixbusu = false;
};
// area table summizer
function updateIndicator() {
const elements = document.querySelectorAll('td[id^="owopfuck-fill-"][id$="-time"]');
const regex = /\d+/;
let sum = 0;
Array.from(elements).forEach(element => {
if (regex.test(element.id)) {
const innerText = element.innerText;
const number = parseFloat(innerText.replace('s', ''));
sum += number;
}
});
sum = sum.toFixed(2) + "s";
if (sum == "0.00s") sum = "no job";
owopfuck.infowindow.container.childNodes[0].childNodes[3].innerText = "Time remaining: " + sum;
};
function updateAreaPoses() {
const elements = document.querySelectorAll('td[id^="owopfuck-fill-"][id$="-pos"]');
owopfuck.area_poses = [];
Array.from(elements).forEach(element => {
element = element.children[0].title.split(";");
let start = element[0].split(",");
let end = element[1].split(",");
start = start.map(Number);
end = end.map(Number);
let complete = [start, end];
if (owopfuck.area_poses.indexOf(complete) == -1) owopfuck.area_poses.push(complete);
});
};
// filling functions
let jobs = 0;
function updateJobsIndicator() {
if (jobs > 0)
owopfuck.infowindow.container.childNodes[0].childNodes[6].innerText = "Jobs: " + jobs;
else if (jobs === 0)
owopfuck.infowindow.container.childNodes[0].childNodes[6].innerText = "Jobs: no jobs";
};
async function fill(x1, y1, x2, y2, color, item, tool) {
x2--; y2--;
jobs++;
updateJobsIndicator();
if (bots.length === 0) return;
for ([x, y] of patterns[document.querySelector(`select[name^='${tool}']`).selectedIndex](x1, y1, x2, y2)) {
const abc = getFree();
const pixel = OWOP.world.getPixel(x, y);
if (!eq(pixel, color)) {
await placePixel(x, y, color, item, abc);
bots[abc].net.bucket.canSpend(0);
if (bots[abc].net.bucket.allowance < getValue("freebucket"))
if (getValue("instaplace"))
await bots[abc].net.bucket.waitUntilRestore();
else
await sleep(Math.ceil(bots[abc].net.bucket.time * 1000 / bots[abc].net.bucket.rate) * jobs);
else {
if (!getValue("instaplace")) await sleep(0);
};
};
};
jobs--;
updateJobsIndicator();
};
async function unfill(x1, y1, x2, y2, color, uncolor, item, tool) {
x2--; y2--;
jobs++;
updateJobsIndicator();
for ([x, y] of patterns[document.querySelector(`select[name^='${tool}']`).selectedIndex](x1, y1, x2, y2)) {
const abc = getFree();
const pixel = OWOP.world.getPixel(x, y);
if (eq(pixel, uncolor) && !eq(pixel, color)) {
bots[abc].net.bucket.canSpend(0);
await placePixel(x, y, color, item, abc);
if (bots[abc].net.bucket.allowance < getValue("freebucket"))
if (getValue("instaplace"))
await bots[abc].net.bucket.waitUntilRestore();
else
await sleep(Math.ceil(bots[abc].net.bucket.time * 1000 / bots[abc].net.bucket.rate) * jobs);
else {
if (!getValue("instaplace")) await sleep(0);
};
};
};
jobs--;
updateJobsIndicator();
};
async function paste(x1, y1, imageData, assetContext) {
jobs++;
updateJobsIndicator();
for ([x, y] of patterns[document.querySelector("select[name^='pastepattern']").selectedIndex](x1, y1, x1 + imageData.width - 1, y1 + imageData.height - 1)) {
// TODO: Make color blending.
const pixel = await OWOP.world.getPixel(x, y);
const color = pixColor(assetContext, x - x1, y - y1);
const i = getIbyXY(x - x1, y - y1, imageData.width);
const transparency = Math.floor(Math.floor(imageData.data[i + 3] * 2) / 255); // 2 because the original value is devided by 2 by some reason
const blendedColor = lerp(pixel, color, transparency);
const abc = getFree();
if (!eq(pixel, blendedColor)) {
bots[abc].net.bucket.canSpend(0);
await placePixel(x, y, blendedColor, null, abc);
if (bots[abc].net.bucket.allowance < getValue("freebucket"))
if (getValue("instaplace"))
await bots[abc].net.bucket.waitUntilRestore();
else
await sleep(Math.ceil(bots[abc].net.bucket.time * 1000 / bots[abc].net.bucket.rate) * jobs);
else {
if (!getValue("instaplace")) await sleep(0);
};
};
};
jobs--;
updateJobsIndicator();
};
// tools
// let LastChunkTime = Date.now();
OWOP.tools.addToolObject(new OWOP.tools.class('Bot Erase', OWOP.cursors.erase, OWOP.fx.player.RECT_SELECT_ALIGNED(16), OWOP.RANK.USER, function (tool) {
tool.setFxRenderer((fx, ctx) => {
var x = (fx.extra.player.x);
var y = (fx.extra.player.y);
var diameter = parseInt(getValue("eraserdiameter"));
var pxc = tool.diam * 16;
var fxx = (tool.diam * Math.floor(x / pxc) - OWOP.camera.x) * OWOP.camera.zoom;
var fxy = (tool.diam * Math.floor(y / pxc) - OWOP.camera.y) * OWOP.camera.zoom;
ctx.globalAlpha = 0.5;
ctx.fillStyle = fx.extra.player.htmlRgb;
ctx.fillRect(fxx, fxy, OWOP.camera.zoom * diameter, OWOP.camera.zoom * diameter);
return 1;
});
tool.setEvent('mousedown mousemove', async function (mouse) {
if (mouse.buttons === 0 || mouse.buttons === 4) return;
if (bots.length === 0) return;
// if(Date.now() - LastChunkTime < 100) return;
// LastChunkTime = Date.now();
let pix = parseInt(getValue("eraserdiameter"));
tool.diam = pix;
let color = mouse.buttons === 1 ? OWOP.player.selectedColor : [255, 255, 255];
let chunkx = x1 = Math.floor(OWOP.mouse.tileX / pix) * pix;
let chunky = y1 = Math.floor(OWOP.mouse.tileY / pix) * pix;
const str = JSON.stringify([chunkx, chunky]);
if (owopfuck.erase_poses.indexOf(str) === -1) {
owopfuck.erase_poses.push(str);
await fill(chunkx, chunky, chunkx + pix, chunky + pix, color, null, "eraserpattern");
owopfuck.erase_poses = owopfuck.erase_poses.filter(pos => pos !== str);
};
});
}));
OWOP.on(events.tick, () => {
if (OWOP.player.tool.name === "Bot Paste") {
owopfuck.assetswindow.container.parentNode.hidden = false;
} else {
owopfuck.assetswindow.container.parentNode.hidden = true;
};
if (OWOP.player.tool.name.toLowerCase().includes("area")) {
owopfuck.jobswindow.container.parentNode.hidden = false;
} else {
owopfuck.jobswindow.container.parentNode.hidden = true;
};
});
let assetContext;
OWOP.tools.addToolObject(new OWOP.tools.class("Bot Paste", OWOP.cursors.paste, OWOP.fx.player.RECT_SELECT_ALIGNED(1), OWOP.RANK.USER, tool => {
let cvs = document.createElement("canvas");
tool.setFxRenderer(function (fx, ctx) {
let fxx = Math.floor(OWOP.mouse.tileX << 4 / 16) - OWOP.camera.x;
let fxy = Math.floor(OWOP.mouse.tileY << 4 / 16) - OWOP.camera.y;
if (fx.extra.isLocalPlayer && cvs.width && cvs.height) {
ctx.strokeStyle = "#000000";
ctx.scale(OWOP.camera.zoom, OWOP.camera.zoom);
ctx.drawImage(cvs, fxx, fxy);
ctx.scale(1 / OWOP.camera.zoom, 1 / OWOP.camera.zoom);
ctx.globalAlpha = 0.5;
ctx.strokeRect(fxx * OWOP.camera.zoom, fxy * OWOP.camera.zoom, cvs.width * OWOP.camera.zoom, cvs.height * OWOP.camera.zoom);
return 0;
};
});
tool.setEvent("mousedown mousemove", async function (mouse) {
if (mouse.buttons === 1) {
if (!selectedAsset) OWOP.chat.local("No asset selected!");
if (typeof selectedAsset === "string") {
// convert
let ctx = cvs.getContext('2d');
assetContext = ctx;
let img = new Image();
img.onload = () => {
cvs.width = img.width;
cvs.height = img.height;
ctx.globalAlpha = 0.5;
ctx.drawImage(img, 0, 0);
// asset
selectedAsset = ctx.getImageData(0, 0, img.naturalWidth, img.naturalHeight);
};
img.src = selectedAsset;
return OWOP.chat.local("Image is ready.");
};
let Pixelization = getValue("pixelization");
let x = !Pixelization ? OWOP.mouse.tileX : Math.floor(OWOP.mouse.tileX / 16) * 16,
y = !Pixelization ? OWOP.mouse.tileY : Math.floor(OWOP.mouse.tileY / 16) * 16;
paste(x, y, selectedAsset);
};
});
}));
OWOP.tools.addToolObject(new OWOP.tools.class('Bot Cursor', OWOP.cursors.cursor, OWOP.fx.player.RECT_SELECT_ALIGNED(1), OWOP.RANK.USER, function (tool) {
var lastX, lastY;
tool.setEvent('mousedown mousemove', async function (mouse) {
if (getFree() === -1 || mouse.buttons === 4 || mouse.buttons === 0) return;
if (!lastX || !lastY) {
lastX = OWOP.mouse.tileX;
lastY = OWOP.mouse.tileY;
};
(0, OWOP.util.line)(lastX, lastY, OWOP.mouse.tileX, OWOP.mouse.tileY, 1, async function (x, y) {
var color = mouse.buttons === 2 ? [255, 255, 255] : OWOP.player.selectedColor;
await placePixel(x, y, color);
});
lastX = OWOP.mouse.tileX;
lastY = OWOP.mouse.tileY;
});
tool.setEvent('mouseup', function (mouse) {
lastX = null;
lastY = null;
});
}));
let textContext;
OWOP.tools.addToolObject(new OWOP.tools.class("Bot Text", OWOP.cursors.write, OWOP.fx.player.RECT_SELECT_ALIGNED(1), OWOP.RANK.USER, tool => {
let cvs = document.createElement("canvas");
let imageData;
tool.setEvent("mousedown", async function (mouse) {
if (mouse.buttons === 1) {
var text = prompt("Text to draw:");
var font = prompt("Text font:\n \n30px Arial");
imageData = getTextImageData(text, font);
// convert
let ctx = cvs.getContext("2d");
textContext = ctx;
let Pixelization = getValue("pixelization");
let x = !Pixelization ? OWOP.mouse.tileX : Math.floor(OWOP.mouse.tileX / 16) * 16,
y = !Pixelization ? OWOP.mouse.tileY : Math.floor(OWOP.mouse.tileY / 16) * 16;
for (let i = 0; i < imageData.data.length; i += 4) {
if (
imageData.data[i + 3] == 255
) {
imageData.data[i] = 0;
imageData.data[i + 1] = 0;
imageData.data[i + 2] = 0;
imageData.data[i + 3] = 255;
};
};
paste(x, y, imageData, textContext);
};
});
}));
let brDiameter = 2;
OWOP.tools.addToolObject(new OWOP.tools.class('Bot Brush', OWOP.cursors.brush, OWOP.fx.player.RECT_SELECT_ALIGNED(brDiameter), false, function (tool) {
tool.brDiameter = 2; //Declaring variable for brush diameter.
var lastX, lastY;
tool.setEvent('mousedown mousemove', async function (mouse) {
const usedButtons = 3; /* Left and right mouse buttons are always used... */
const color = mouse.buttons === 2 ? [255, 255, 255] : OWOP.player.selectedColor; /* White color if right clicking */
if (mouse.buttons === 2 || mouse.buttons === 1) {
if (!lastX || !lastY) {
lastX = OWOP.mouse.tileX;
lastY = OWOP.mouse.tileY;
};
(0, OWOP.util.line)(lastX, lastY, OWOP.mouse.tileX, OWOP.mouse.tileY, 1, async function (x, y) {
const R = Math.floor(tool.brDiameter / 2);
if (getFree() === -1) return;
for (var ix = 0; ix < tool.brDiameter; ix++) {
for (var iy = 0; iy < tool.brDiameter; iy++) {
if (!eq(OWOP.world.getPixel(x + ix - R, y + iy - R), color)) {
await placePixel(x + ix - R, y + iy - R, color);
};
};
};
});
lastX = OWOP.mouse.tileX;
lastY = OWOP.mouse.tileY;
};
return usedButtons;
});
tool.setEvent('mouseup', function (mouse) {
lastX = null;
lastY = null;
});
tool.setFxRenderer(function (fx, ctx, time) {
var x = fx.extra.player.x;
var y = fx.extra.player.y;
var diameter = tool.brDiameter
var fxx = (Math.floor(x / 16) - Math.floor(diameter / 2) - OWOP.camera.x) * OWOP.camera.zoom;
var fxy = (Math.floor(y / 16) - Math.floor(diameter / 2) - OWOP.camera.y) * OWOP.camera.zoom;
ctx.globalAlpha = 0.8;
ctx.strokeStyle = fx.extra.player.htmlRgb;
ctx.strokeRect(fxx, fxy, OWOP.camera.zoom * diameter, OWOP.camera.zoom * diameter);
return 1; /* Rendering finished (won't change on next frame) */
});
}));
OWOP.windowSys.addWindow(new OWOP.windowSys.class.window('Bot Brush diameter', {}, function (win) {
win.container.title = 'Bot Brush Diameter';
win.container.style.height = '16px';
win.container.style.overflow = 'hidden';
var brDiamElmm = OWOP.util.mkHTML('span', {
innerHTML: OWOP.tools.allTools['bot brush'].brDiameter
});
win.addObj(brDiamElmm);
var Rbarr = OWOP.util.mkHTML('input', {
type: 'range',
style: '-moz-appearance:none;-webkit-appearance:none;appearance:none;height:6px;outline:none;float:right;',
min: 2,
max: 16,
value: OWOP.tools.allTools['bot brush'].brDiameter,
oninput: function () {
OWOP.tools.allTools['bot brush'].brDiameter = this.value;
brDiamElmm.innerHTML = this.value;
},
ondblclick: function () {
this.value = 1;
this.onchange();
}
});
win.addObj(Rbarr);
}).move(800, 32));
OWOP.tools.addToolObject(new OWOP.tools.class("Bot Protection", OWOP.cursors.shield, OWOP.fx.player.RECT_SELECT_ALIGNED(16), OWOP.RANK.USER, tool => {
tool.setFxRenderer((fx, ctx) => {
if (!OWOP.world.protection) OWOP.world.protection = {
intervals: {},
pixels: {},
chunks: []
};
try {
const X = fx.extra.player.x,
Y = fx.extra.player.y,
cX = (16 * Math.floor(X / 256) - OWOP.camera.x) * OWOP.camera.zoom,
cY = (16 * Math.floor(Y / 256) - OWOP.camera.y) * OWOP.camera.zoom,
tX = fx.extra.player.tileX,
tY = fx.extra.player.tileY,
chunk = OWOP.world.protection.pixels[`${tX},${tY}`];
ctx.globalAlpha = .5;
ctx.fillStyle = chunk ? "#00FF00" : "#FF0000";
ctx.fillRect(cX, cY, 16 * OWOP.camera.zoom, 16 * OWOP.camera.zoom);
} catch (error) {
const X = fx.extra.player.x,
Y = fx.extra.player.y,
cX = (16 * Math.floor(X / 256) - OWOP.camera.x) * OWOP.camera.zoom,
cY = (16 * Math.floor(Y / 256) - OWOP.camera.y) * OWOP.camera.zoom,
tX = fx.extra.player.tileX,
tY = fx.extra.player.tileY;
ctx.globalAlpha = .5;
ctx.fillStyle = "#FF0000";
ctx.fillRect(cX, cY, 16 * OWOP.camera.zoom, 16 * OWOP.camera.zoom);
};
return true;
});
tool.setEvent("mousedown mousemove", fx => {
if (!OWOP.world.protection) return;
const X = Math.floor(OWOP.mouse.tileX / OWOP.options.serverAddress[0].proto.chunkSize) * 16,
Y = Math.floor(OWOP.mouse.tileY / OWOP.options.serverAddress[0].proto.chunkSize) * 16,
chunk = OWOP.world.protection.pixels[`${X},${Y}`];
let chunkX = Math.floor(OWOP.mouse.tileX / 16).toString();
let chunkY = Math.floor(OWOP.mouse.tileY / 16).toString();
switch (fx.buttons) {
case 1:
if (chunk) return false;
for (let y = 0; y < 16; y++)
for (let x = 0; x < 16; x++) {
OWOP.world.protection.pixels[`${X + x},${Y + y}`] = OWOP.world.getPixel(X + x, Y + y);
OWOP.world.protection.intervals[`${X + x},${Y + y}`] = setInterval(() => {
if (!eq(OWOP.world.getPixel(X + x, Y + y), OWOP.world.protection.pixels[`${X + x},${Y + y}`])) {
protection_queue.unshift({
pos: [X + x, Y + y],
color: OWOP.world.protection.pixels[`${X + x},${Y + y}`]
});
let abc = getFree();
bots[abc].world.setPixel(X + x, Y + y, OWOP.world.protection.pixels[`${X + x},${Y + y}`]);
}
}, 2000);
};
if (OWOP.world.protection.chunks.indexOf(`${chunkX},${chunkY}`) == -1) OWOP.world.protection.chunks.push(`${chunkX},${chunkY}`);
return true;
break;
case 2:
if (!chunk) return false;
for (let y = 0; y < 16; y++)
for (let x = 0; x < 16; x++) {
clearInterval(OWOP.world.protection.intervals[`${X + x},${Y + y}`]);
delete OWOP.world.protection.intervals[`${X + x},${Y + y}`];
delete OWOP.world.protection.pixels[`${X + x},${Y + y}`];
OWOP.world.protection.chunks = OWOP.world.protection.chunks.filter(pos => pos !== `${chunkX},${chunkY}`);
};
break;
};
owopfuck.infowindow.container.childNodes[0].childNodes[9].innerText = "Protected chunks: " + OWOP.world.protection.chunks.length;
});
}));
OWOP.tools.addToolObject(new OWOP.tools.class('Bot Fill', OWOP.cursors.fill, OWOP.fx.player.NONE, OWOP.RANK.USER, function (tool) {
let stopFlag = false;
async function flooFill(x, y, targetColor, fillColor) {
if (!targetColor || eq(targetColor, fillColor)) return;
const pixelQueue = [[x, y]];
const visited = new Set();
while (pixelQueue.length > 0) {
if (stopFlag) return;
const [x, y] = pixelQueue.shift();
if (visited.has(`${x},${y}`)) continue;
visited.add(`${x},${y}`);
const currentColor = await OWOP.world.getPixel(x, y);
if (!currentColor) return;
if (currentColor[0] !== targetColor[0] || currentColor[1] !== targetColor[1] || currentColor[2] !== targetColor[2]) continue;
await placePixel(x, y, fillColor);
pixelQueue.push([x + 1, y]);
pixelQueue.push([x - 1, y]);
pixelQueue.push([x, y + 1]);
pixelQueue.push([x, y - 1]);
// add diagonals to the queue to fill in a circular pattern
if (!getValue("diagfill")) {
pixelQueue.push([x + 1, y + 1]);
pixelQueue.push([x + 1, y - 1]);
pixelQueue.push([x - 1, y + 1]);
pixelQueue.push([x - 1, y - 1]);
};
await sleep(1);
};
};
function stopFill() {
stopFlag = true;
busy = false;
};
let busy = false;
async function startFill(newX, newY, targetColor, fillColor) {
if (busy) return;
busy = true;
stopFlag = false;
await flooFill(newX, newY, targetColor, fillColor);
};
tool.setEvent("mousedown", async function (mouse) {
if (mouse.buttons == 0 || mouse.buttons == 4) return;
if (bots.length === 0) return;
startFill(mouse.tileX, mouse.tileY, OWOP.world.getPixel(mouse.tileX, mouse.tileY), OWOP.player.selectedColor);
});
tool.setEvent("mouseup deselect", () => {
stopFill();
return;
});
}));
OWOP.tools.addToolObject(new OWOP.tools.class('Bot Area', OWOP.cursors.select, OWOP.fx.player.NONE, OWOP.RANK.USER, function (tool) {
let step = 1;
try {
tool.setFxRenderer(function (fx, ctx, time) {
if (!fx.extra.isLocalPlayer) return 1;
let x = fx.extra.player.x;
let y = fx.extra.player.y;
let fxx = (Math.floor(x / step) - OWOP.camera.x) * OWOP.camera.zoom;
let fxy = (Math.floor(y / step) - OWOP.camera.y) * OWOP.camera.zoom;
let oldlinew = ctx.lineWidth;
ctx.lineWidth = 1;
if (tool.extra.end) {
let s = tool.extra.start;
let e = tool.extra.end;
let x = (s[0] - OWOP.camera.x) * OWOP.camera.zoom + 0.5;
let y = (s[1] - OWOP.camera.y) * OWOP.camera.zoom + 0.5;
let w = e[0] - s[0];
let h = e[1] - s[1];
ctx.beginPath();
ctx.rect(x, y, w * OWOP.camera.zoom, h * OWOP.camera.zoom);
ctx.globalAlpha = 0.25;
ctx.strokeStyle = "#FFFFFF";
ctx.stroke();
ctx.setLineDash([3, 4]);
ctx.strokeStyle = "#000000";
ctx.stroke();
ctx.globalAlpha = 0.25 + Math.sin(time / 320) / 4;
ctx.fillStyle = OWOP.renderer.patterns.unloaded;
ctx.fill();
ctx.setLineDash([]);
let oldfont = ctx.font;
ctx.font = "16px sans-serif";
let txt = (!tool.extra.clicking ? "M2 Inside to void. " : '') + `(${Math.abs(w)}x${Math.abs(h)}, ${(Math.abs(w) / 16 * Math.abs(h) / 16).toFixed(4)} chunks)`
let txtx = window.innerWidth >> 1;
let txty = window.innerHeight >> 1;
txtx = Math.max(x, Math.min(txtx, x + w * OWOP.camera.zoom));
txty = Math.max(y, Math.min(txty, y + h * OWOP.camera.zoom));
OWOP.drawText = (ctx, str, x, y, centered) => {
ctx.strokeStyle = "#000000", ctx.fillStyle = "#FFFFFF", ctx.lineWidth = 2.5, ctx.globalAlpha = 1;
if (centered) {
x -= ctx.measureText(str).width >> 1;
}
ctx.strokeText(str, x, y);
ctx.globalAlpha = 1;
ctx.fillText(str, x, y);
};
OWOP.drawText(ctx, txt, txtx, txty, true);
ctx.font = oldfont;
ctx.lineWidth = oldlinew;
return 0;
} else {
ctx.beginPath();
ctx.moveTo(0, fxy + 0.5);
ctx.moveTo(fxx + 0.5, 0);
//ctx.lineWidth = 1;
ctx.globalAlpha = 0.8;
ctx.strokeStyle = "#FFFFFF";
ctx.stroke();
ctx.setLineDash([3]);
ctx.strokeStyle = "#000000";
ctx.stroke();
ctx.setLineDash([]);
ctx.lineWidth = oldlinew;
return 1;
}
});
tool.extra.start = null;
tool.extra.end = null;
tool.extra.clicking = false;
tool.setEvent('mousedown', function (mouse) {
let s = tool.extra.start;
let e = tool.extra.end;
let isInside = function isInside() {
return mouse.tileX >= s[0] && mouse.tileX < e[0] && mouse.tileY >= s[1] && mouse.tileY < e[1];
};
if (mouse.buttons === 1 && !tool.extra.end) {
tool.extra.start = [Math.floor(mouse.tileX / step) * step, Math.floor(mouse.tileY / step) * step];
tool.extra.clicking = true;
tool.setEvent('mousemove', function (mouse) {
if (tool.extra.start && mouse.buttons === 1) {
tool.extra.end = [Math.floor(mouse.tileX / step) * step, Math.floor(mouse.tileY / step) * step];
return 1;
}
});
let finish = function finish() {
tool.setEvent('mousemove mouseup deselect', null);
tool.extra.clicking = false;
let s = tool.extra.start;
let e = tool.extra.end;
if (e) {
if (s[0] === e[0] || s[1] === e[1]) {
tool.extra.start = null;
tool.extra.end = null;
}
if (s[0] > e[0]) {
let tmp = e[0];
e[0] = s[0];
s[0] = tmp;
}
if (s[1] > e[1]) {
let tmp = e[1];
e[1] = s[1];
s[1] = tmp;
}
}
OWOP.renderer.render(OWOP.renderer.rendertype.FX);
};
tool.setEvent('deselect', finish);
tool.setEvent('mouseup', function (mouse) {
if (!(mouse.buttons & 1)) {
finish();
};
});
} else if (mouse.buttons === 1 && tool.extra.end) {
if (isInside()) {
let offx = mouse.tileX;
let offy = mouse.tileY;
tool.setEvent('mousemove', function (mouse) {
let dx = mouse.tileX - offx;
let dy = mouse.tileY - offy;
tool.extra.start = [s[0] + dx, s[1] + dy];
tool.extra.end = [e[0] + dx, e[1] + dy];
});
let end = function end() {
tool.setEvent('mouseup deselect mousemove', null);
};
tool.setEvent('deselect', end);
tool.setEvent('mouseup', function (mouse) {
if (!(mouse.buttons & 1)) {
end();
};
});
}
} else if (mouse.buttons === 2 && tool.extra.end && isInside()) {
let w = tool.extra.end[0] - tool.extra.start[0];
let h = tool.extra.end[1] - tool.extra.start[1];
let color = OWOP.player.selectedColor;
let chunkx = tool.extra.start[0];
let chunky = tool.extra.start[1];
let element = document.createElement("div");
element.style.position = "fixed";
element.style.transformOrigin = "left top 0px";
element.style.overflow = "hidden";
element.style.width = gameToSize(w, h).width;
element.style.height = gameToSize(w, h).height;
element.style.backgroundColor = `rgba(${[color[0], color[1], color[2]].join(", ")}, 0.5)`;
if (getValue("areahighlightblink")) {
var style = document.createElement("style");
style.innerHTML = `
@keyframes blink {
0% { opacity: 1; }
50% { opacity: 0; }
100% { opacity: 1; }
}`;
element.style.animation = "blink 1s infinite";
document.head.appendChild(style);
};
var shown = false;
var ismag = false;
var finished = false;
function move() {
var sc = OWOP.camera.zoom / 16;
var pixelSize = 32 * sc;
var gameX = chunkx / 2;
var gameY = chunky / 2;
var screenX = (-OWOP.camera.x) * OWOP.camera.zoom + gameX * pixelSize;
var screenY = (-OWOP.camera.y) * OWOP.camera.zoom + gameY * pixelSize;
if (screenX > -512 && screenY > -512 && screenX < window.innerWidth && screenY < window.innerHeight) {
if (sc > 1.0 && !ismag) {
ismag = true;
element.style.imageRendering = 'pixelated';
} else if (sc <= 1.0 && ismag) {
ismag = false;
element.style.imageRendering = 'auto';
};
element.style.transform = `matrix(${sc}, 0, 0, ${sc}, ${Math.round(screenX)}, ${Math.round(screenY)})`;
if (!shown) {
OWOP.elements.viewport.appendChild(element);
shown = true;
};
} else {
if (shown) {
element.remove();
shown = false;
};
};
if (!getValue("areahighlight") || finished) {
shown = false;
OWOP.removeListener(OWOP.events.camMoved || OWOP.events.camera.moved, move);
element.remove();
};
};
// if(getValue("areahighlight")) {
// move();
OWOP.on(OWOP.events.tick, move);
// };
const totalPixels = w * h; // TODO: make this more accurate by counting every different pixel
let filledPixels = 0;
let job_id = `${tool.extra.start.toString()}-${tool.extra.end.toString()}`;
let id = `owopfuck-fill-${job_id}`;
let fillTable = document.createElement("tr");
fillTable.innerHTML = ` |
? |
| `;
fillTable.id = `owopfuck-job-${job_id}`;
document.getElementById("owopfuck-jobs").appendChild(fillTable);
document.getElementById(id + "-tp").addEventListener("click", () => {
OWOP.emit(6666695, chunkx, chunky);
});
let item = `setPixel_${chunkx.toString().replace("-", "_")}_${chunky.toString().replace("-", "_")}_${(chunkx + w).toString().replace("-", "_")}_${(chunky + h).toString().replace("-", "_")}`;
document.getElementById(id + "-stopbtn").addEventListener("click", () => {
bots.forEach(bot => delete bot.world[item]);
fillTable.remove();
shown = false;
finished = true;
move();
OWOP.removeListener(OWOP.events.camMoved || OWOP.events.camera.moved, move);
updateIndicator();
updateAreaPoses();
});
(async function () {
bots.forEach(bot => {
bot.world[item] = (...args) => {
if (bot.net.bucket.allowance >= getValue("freebucket")) filledPixels++;
bot.world.originalSetPixel(...args);
if ((!getValue("livepredtime") && filledPixels % 100 === 0) || getValue("livepredtime")) {
const elapsedTime = Date.now() - startTime;
let remainingTime = (elapsedTime / filledPixels) * (totalPixels - filledPixels);
if (remainingTime < 0) remainingTime = 0;
if (document.getElementById(id + "-time")) document.getElementById(id + "-time").innerText = `${(remainingTime / 1000).toFixed(2)}s`;
updateIndicator();
};
updateAreaPoses();
};
});
let startTime = Date.now();
await fill(chunkx, chunky, chunkx + w, chunky + h, color, item, "areapattern");
await (async () => {
bots.forEach(bot => delete bot.world[item]);
fillTable.remove();
shown = false;
finished = true;
move();
OWOP.removeListener(OWOP.events.camMoved || OWOP.events.camera.moved, move);
updateIndicator();
updateAreaPoses();
})();
})();
} else {
tool.extra.start = null;
tool.extra.end = null;
};
});
} catch (e) {
console.log(e);
};
}));
OWOP.tools.addToolObject(new OWOP.tools.class('Bot Unpixel area', OWOP.cursors.select, OWOP.fx.player.NONE, OWOP.RANK.USER, function (tool) {
let step = 1;
let toreplace = [0, 0, 0];
try {
tool.setFxRenderer(function (fx, ctx, time) {
if (!fx.extra.isLocalPlayer) return 1;
let x = fx.extra.player.x;
let y = fx.extra.player.y;
let fxx = (Math.floor(x / step) - OWOP.camera.x) * OWOP.camera.zoom;
let fxy = (Math.floor(y / step) - OWOP.camera.y) * OWOP.camera.zoom;
let oldlinew = ctx.lineWidth;
ctx.lineWidth = 1;
if (tool.extra.end) {
let s = tool.extra.start;
let e = tool.extra.end;
let x = (s[0] - OWOP.camera.x) * OWOP.camera.zoom + 0.5;
let y = (s[1] - OWOP.camera.y) * OWOP.camera.zoom + 0.5;
let w = e[0] - s[0];
let h = e[1] - s[1];
ctx.beginPath();
ctx.rect(x, y, w * OWOP.camera.zoom, h * OWOP.camera.zoom);
ctx.globalAlpha = 0.25;
ctx.strokeStyle = "#FFFFFF";
ctx.stroke();
ctx.setLineDash([3, 4]);
ctx.strokeStyle = "#000000";
ctx.stroke();
ctx.globalAlpha = 0.25 + Math.sin(time / 320) / 4;
ctx.fillStyle = OWOP.renderer.patterns.unloaded;
ctx.fill();
ctx.setLineDash([]);
let oldfont = ctx.font;
ctx.font = "16px sans-serif";
let txt = (!tool.extra.clicking ? "M2 Inside to void. " : '') + `(${Math.abs(w)}x${Math.abs(h)}, ${(Math.abs(w) / 16 * Math.abs(h) / 16).toFixed(4)} chunks)`
let txtx = window.innerWidth >> 1;
let txty = window.innerHeight >> 1;
txtx = Math.max(x, Math.min(txtx, x + w * OWOP.camera.zoom));
txty = Math.max(y, Math.min(txty, y + h * OWOP.camera.zoom));
OWOP.drawText = (ctx, str, x, y, centered) => {
ctx.strokeStyle = "#000000", ctx.fillStyle = "#FFFFFF", ctx.lineWidth = 2.5, ctx.globalAlpha = 1;
if (centered) {
x -= ctx.measureText(str).width >> 1;
}
ctx.strokeText(str, x, y);
ctx.globalAlpha = 1;
ctx.fillText(str, x, y);
};
OWOP.drawText(ctx, txt, txtx, txty, true);
ctx.font = oldfont;
ctx.lineWidth = oldlinew;
return 0;
} else {
ctx.beginPath();
ctx.moveTo(0, fxy + 0.5);
ctx.moveTo(fxx + 0.5, 0);
//ctx.lineWidth = 1;
ctx.globalAlpha = 0.8;
ctx.strokeStyle = "#FFFFFF";
ctx.stroke();
ctx.setLineDash([3]);
ctx.strokeStyle = "#000000";
ctx.stroke();
ctx.setLineDash([]);
ctx.lineWidth = oldlinew;
return 1;
}
});
tool.extra.start = null;
tool.extra.end = null;
tool.extra.clicking = false;
tool.setEvent('keydown', function (key) {
if (key["17"]) {
toreplace = OWOP.world.getPixel(OWOP.mouse.tileX, OWOP.mouse.tileY);
OWOP.chat.local(`Unpixel [${toreplace.join(", ")}] to selected color.`);
};
});
tool.setEvent('mousedown', function (mouse) {
let s = tool.extra.start;
let e = tool.extra.end;
let isInside = function isInside() {
return mouse.tileX >= s[0] && mouse.tileX < e[0] && mouse.tileY >= s[1] && mouse.tileY < e[1];
};
if (mouse.buttons === 1 && !tool.extra.end) {
tool.extra.start = [Math.floor(mouse.tileX / step) * step, Math.floor(mouse.tileY / step) * step];
tool.extra.clicking = true;
tool.setEvent('mousemove', function (mouse) {
if (tool.extra.start && mouse.buttons === 1) {
tool.extra.end = [Math.floor(mouse.tileX / step) * step, Math.floor(mouse.tileY / step) * step];
return 1;
}
});
let finish = function finish() {
tool.setEvent('mousemove mouseup deselect', null);
tool.extra.clicking = false;
let s = tool.extra.start;
let e = tool.extra.end;
if (e) {
if (s[0] === e[0] || s[1] === e[1]) {
tool.extra.start = null;
tool.extra.end = null;
}
if (s[0] > e[0]) {
let tmp = e[0];
e[0] = s[0];
s[0] = tmp;
}
if (s[1] > e[1]) {
let tmp = e[1];
e[1] = s[1];
s[1] = tmp;
}
}
OWOP.renderer.render(OWOP.renderer.rendertype.FX);
};
tool.setEvent('deselect', finish);
tool.setEvent('mouseup', function (mouse) {
if (!(mouse.buttons & 1)) {
finish();
};
});
} else if (mouse.buttons === 1 && tool.extra.end) {
if (isInside()) {
let offx = mouse.tileX;
let offy = mouse.tileY;
tool.setEvent('mousemove', function (mouse) {
let dx = mouse.tileX - offx;
let dy = mouse.tileY - offy;
tool.extra.start = [s[0] + dx, s[1] + dy];
tool.extra.end = [e[0] + dx, e[1] + dy];
});
let end = function end() {
tool.setEvent('mouseup deselect mousemove', null);
};
tool.setEvent('deselect', end);
tool.setEvent('mouseup', function (mouse) {
if (!(mouse.buttons & 1)) {
end();
};
});
}
} else if (mouse.buttons === 2 && tool.extra.end && isInside()) {
let w = tool.extra.end[0] - tool.extra.start[0];
let h = tool.extra.end[1] - tool.extra.start[1];
let color = OWOP.player.selectedColor;
let chunkx = tool.extra.start[0];
let chunky = tool.extra.start[1];
let element = document.createElement("div");
element.style.position = "fixed";
element.style.transformOrigin = "left top 0px";
element.style.overflow = "hidden";
element.style.width = gameToSize(w, h).width;
element.style.height = gameToSize(w, h).height;
element.style.backgroundColor = `rgba(${[color[0], color[1], color[2]].join(", ")}, 0.5)`;
if (getValue("areahighlightblink")) {
var style = document.createElement("style");
style.innerHTML = `
@keyframes blink {
0% { opacity: 1; }
50% { opacity: 0; }
100% { opacity: 1; }
}`;
element.style.animation = "blink 1s infinite";
document.head.appendChild(style);
};
var shown = false;
var ismag = false;
var finished = false;
function move() {
var sc = OWOP.camera.zoom / 16;
var pixelSize = 32 * sc;
var gameX = chunkx / 2;
var gameY = chunky / 2;
var screenX = (-OWOP.camera.x) * OWOP.camera.zoom + gameX * pixelSize;
var screenY = (-OWOP.camera.y) * OWOP.camera.zoom + gameY * pixelSize;
if (screenX > -512 && screenY > -512 && screenX < window.innerWidth && screenY < window.innerHeight) {
if (sc > 1.0 && !ismag) {
ismag = true;
element.style.imageRendering = 'pixelated';
} else if (sc <= 1.0 && ismag) {
ismag = false;
element.style.imageRendering = 'auto';
};
element.style.transform = `matrix(${sc}, 0, 0, ${sc}, ${Math.round(screenX)}, ${Math.round(screenY)})`;
if (!shown) {
OWOP.elements.viewport.appendChild(element);
shown = true;
};
} else {
if (shown) {
element.remove();
shown = false;
};
};
if (!getValue("areahighlight") || finished) {
shown = false;
OWOP.removeListener(OWOP.events.camMoved || OWOP.events.camera.moved, move);
element.remove();
};
};
// if(getValue("areahighlight")) {
// move();
OWOP.on(OWOP.events.tick, move);
// };
const totalPixels = w * h;
let filledPixels = 0;
let job_id = `${tool.extra.start.toString()}-${tool.extra.end.toString()}`;
let id = `owopfuck-fill-${job_id}`;
let fillTable = document.createElement("tr");
fillTable.innerHTML = ` |
? |
| `;
fillTable.id = `owopfuck-job-${job_id}`;
document.getElementById("owopfuck-jobs").appendChild(fillTable);
document.getElementById(id + "-tp").addEventListener("click", () => {
OWOP.emit(6666695, chunkx, chunky);
});
document.getElementById(id + "-stopbtn").addEventListener("click", () => {
w = 0;
h = 0;
});
(async function () {
let item = `setPixel_${chunkx.toString().replace("-", "_")}_${chunky.toString().replace("-", "_")}_${(chunkx + w).toString().replace("-", "_")}_${(chunky + h).toString().replace("-", "_")}`;
bots.forEach(bot => {
bot.world[item] = (...args) => {
if (bot.net.bucket.allowance >= getValue("freebucket")) filledPixels++;
bot.world.originalSetPixel(...args);
if ((!getValue("livepredtime") && filledPixels % 100 === 0) || getValue("livepredtime")) {
const elapsedTime = Date.now() - startTime;
let remainingTime = (elapsedTime / filledPixels) * (totalPixels - filledPixels);
if (remainingTime < 0) remainingTime = 0;
if (document.getElementById(id + "-time")) document.getElementById(id + "-time").innerText = `${(remainingTime / 1000).toFixed(2)}s`;
updateIndicator();
};
updateAreaPoses();
};
});
let startTime = Date.now();
await unfill(chunkx, chunky, chunkx + w, chunky + h, color, toreplace, item, "areapattern");
await (async () => {
bots.forEach(bot => delete bot.world[item]);
fillTable.remove();
shown = false;
finished = true;
move();
OWOP.removeListener(OWOP.events.camMoved || OWOP.events.camera.moved, move);
updateIndicator();
updateAreaPoses();
})();
})();
} else {
tool.extra.start = null;
tool.extra.end = null;
};
});
} catch (e) {
console.log(e);
};
}));
window.owopfuck = {
assetswindow: OWOP.windowSys.windows["owopfuck assets"],
infowindow: OWOP.windowSys.windows["owopfuck info"],
jobswindow: OWOP.windowSys.windows["owopfuck jobs"],
mainwindow: OWOP.windowSys.windows["owopfuck"],
config: { getValue, setValue },
irc: ircServer,
area_poses: [],
erase_poses: []
};
});
})();