Greasy Fork is available in English.
Pixel Place Compile Client
此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.org/scripts/443844/1050358/PPCC.js
// ==UserScript== // @name PPCC // @description Pixel Place Compile Client // @version 1.6.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 PPClient = window.PPClient || {modules:{}}; window.PPClient = PPClient; if ('Compiler' in PPClient.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(PPClient, { ws: null, map: {}, onclick: null, queueId: 0, queue: [], pos: 0, lock: false, last: [0,0,255], set(x, y, p) { PPClient.queue.push([x, y, p, PPClient.queueId++]); }, _id: 0, _posSocket: 0, sockets: [], getSocket() { let i = 0; let ws = null; while (i++ < PPClient.sockets.length) { const _ws = PPClient.sockets[PPClient._posSocket++]; if (PPClient._posSocket > PPClient.sockets.length-1) PPClient._posSocket = 0; if (!_ws) continue; if (_ws.ignore) continue; if (PPClient.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 (PPClient.pos < PPClient.queue.length) { const [x, y, p, i] = PPClient.queue[PPClient.pos++]; if (p === 255 || PPClient.map.get(x,y) === 255) { PPClient.queue.splice(--PPClient.pos, 1); continue; } if (PPClient.map.get(x,y) === p) continue; const ws = PPClient.getSocket(); if (!ws) { PPClient.pos--; progress = false; return; } ws.can = false; PPClient.CWSS.send.call(ws, `42["p",[${x},${y},${p},${1+PPClient.pos}]]`); continue; } if (PPClient.lock && PPClient.pos > PPClient.queue.length-1) { PPClient.pos = 0; progress = false; return; } PPClient.pos = 0; PPClient.queue = []; PPClient.queueId = 0; progress = false; }; module.main = [timer.setInterval(mainFunc), mainFunc]; PPClient.modules.MapLoader.subscribe((module, map) => { Object.assign(PPClient.map, map); PPClient.map.pixels = new Uint8Array(map.pixels); PPClient.serverId = map.serverId; }); module.hook = { priority: 0, open() { if (!this.username) { PPClient.ws = this; this.addEventListener('close', e=>{ PPClient.ws = null; }); } PPClient.sockets.push(this); this.id = PPClient._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); PPClient.sockets.splice(PPClient.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 (PPClient.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 => PPClient.map.set(...p)); PPClient.ws.ready = true; } if (event == 'p') { json.map(p => PPClient.map.set(...p)); this.count = PPClient.config.packetCount; } return arguments; }, send(data) { if (PPClient.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; PPClient.last = [x, y, pixel]; if (PPClient.onclick && PPClient.onclick(x, y, pixel) === false) return; } return arguments; } }; PPClient.CWSS.setHook(module.hook); }; PPClient.modules.Compiler = module; })(); // 0vC4#7152