// ==UserScript==
// @name PPCC
// @description Pixel Place Compile Client
// @version 1.4.9
// @author 0vC4
// @namespace https://greasyfork.org/users/670183
// @match https://pixelplace.io/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=pixelplace.io
// @license MIT
// @grant none
// @run-at document-start
// ==/UserScript==
const PPCC = (() => {
return {
speed: 30,
compile(client, PPML, CWSS, timer=window) {
const speed = this.speed;
Object.assign(client, {
_id: 0,
_posSocket: 0,
sockets: [],
get socket() {
let i = 0;
let ws = null;
while (i++ < this.sockets.length) {
if (this._posSocket > this.sockets.length-1) this._posSocket = 0;
const _ws = this.sockets[this._posSocket++];
if (!_ws._can) continue;
ws = _ws;
break;
}
return ws;
},
ws: null,
map: {},
onclick: null,
last: [0, 0, 255],
lock: false,
_pixelQueue: [],
_posQueue: 0,
safeEmit(x, y, pixel) {
this._pixelQueue.push(x, y, pixel);
},
send(data) {
CWSS.send.call(client.ws, data);
}
});
timer.setInterval(() => {
while (client._posQueue <= client._pixelQueue.length-3) {
client._posQueue += 3;
const [x, y, pixel] = client._pixelQueue.slice(client._posQueue-3, client._posQueue);
if (client.map.get(x,y) === 255 || pixel === 255) continue;
if (client.map.get(x,y) === pixel) continue;
const ws = client.socket;
if (!ws) {
client._posQueue -= 3;
return;
}
CWSS.send.call(ws, `42["p",[${x},${y},${pixel},1]]`);
ws._can = false;
return;
}
if (client.lock && client._posQueue > client._pixelQueue.length-3) {
client._posQueue = 0;
return;
}
client._posQueue = 0;
client._pixelQueue = [];
});
PPML.onload = map => {
Object.assign(client.map, map);
client.map.pixels = new Uint8Array(map.pixels);
};
CWSS.setHook({
priority: 0,
init() {
if (client.ws) return arguments;
client.ws = this;
return arguments;
},
open() {
client.sockets.push(this);
this.id = client._id++;
this.addEventListener('close', () => {
timer.clearInterval(this._inter);
client.sockets.splice(client.sockets.indexOf(this),1);
});
this._can = true;
this._inter = timer.setInterval(() => {
this._can = true;
}, 1e3/speed);
return arguments;
},
message({data}) {
if (client.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' || event == 'p') json.map(p => client.map.set(...p));
return arguments;
},
send(data) {
if (client.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;
client.last = [x, y, pixel];
if (client.onclick && client.onclick(x, y, pixel) === false) return;
}
return arguments;
}
});
}
};
})();
// 0vC4#7152