Greasy Fork

PPCC

Pixel Place Compile Client

目前为 2022-04-24 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.cloud/scripts/443844/1043712/PPCC.js

// ==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