// ==UserScript==
// @name PPCC
// @description Pixel Place Compile Client
// @version 1.4.2
// @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) {
Object.assign(client, {
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);
},
liveQueue(client, ws) {
const t = timer.setInterval(() => {
while (client._posQueue < client._pixelQueue.length) {
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;
CWSS.send.call(ws, `42["p",[${x},${y},${pixel},1]]`);
return;
}
if (client.lock && client._posQueue > client._pixelQueue.length-1) {
client._posQueue = 0;
return;
}
client._posQueue = 0;
client._pixelQueue = [];
}, 1e3/speed);
ws.addEventListener('close', () => timer.clearInterval(t));
},
});
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;
client.liveQueue(client, client.ws);
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