PPT

Pixel Place Tools

La data de 02-05-2022. Vezi ultima versiune.

Acest script nu ar trebui instalat direct. Aceasta este o bibliotecă pentru alte scripturi care este inclusă prin directiva meta a // @require https://update.greasyfork.org/scripts/443807/1046406/PPT.js

// ==UserScript==
// @name         PPT
// @description  Pixel Place Tools
// @version      2.5.1
// @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 PPT = (() => {
    if (window.PPT) return window.PPT;



    const worker = function(func) {
        const worker = new Worker(URL.createObjectURL(new Blob(["onmessage=async({data})=>self.postMessage(await(" + func.toString() + ")(data))"], { type: "text/javascript" })));
        const root = {};
        const post = data => (worker.postMessage(data), root);
        const then = callback => (worker.onmessage=({data})=>callback(data), root);
        return Object.assign(root, {post, then});
    };



    const PPT = {
        zero: 0xCCCCCC,
        default: 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
        ]),
        exclude: new Uint32Array([
            0x51E119,
            0xFF3904,
            0x5100FF,
            0x45FFC8
        ]),
        get palette() {
            return this.default.map(color => this.exclude.includes(color) ? this.zero : color);
        },



        _wheelID: 0,
        get wheel() {
            let pixel = this._wheelID+1;

            while (this.palette[pixel] == this.zero)
                if (this.palette[++pixel] == null)
                    pixel = 0;

            this._wheelID = pixel;
            return this._wheelID;
        },



        RGB2P(r, g, b) {
            const closest = [...this.palette]
            .filter(n => n != this.zero)
            .map(clr =>
                [
                    ((r - ((clr>>16)&0xFF))*.299)**2 +
                    ((g - ((clr>>8)&0xFF))*.587)**2 +
                    ((b - (clr&0xFF))*.114)**2,
                    clr
                ]
            )
            .sort((a,b) => a[0]-b[0])
            [0][1];

            return this.palette.indexOf(closest);
        },
        CLR2P(color) {
            return this.RGB2P((color>>16)&0xFF, (color>>8)&0xFF, color&0xFF);
        },
        
        
        
        client: null,
        get order() {
            if (!this.client) throw new Error('assign client variable first');
            const client = this.client;
            const queue = client._pixelQueue;
            
            const [cxn, cyn] = queue.reduce(([x,y], [x2,y2]) => [x+x2,y+y2], [0, 0]);
            const [cx, cy] = [cxn/queue.length>>0, cyn/queue.length>>0];
            
            const workQueue = (func, ...args) => {
                let fin = queue => 0;
                const then = finish => finish && (fin = finish);
                
                worker(func)
                .then(queue => fin(client._pixelQueue = queue))
                .post([queue, ...args]);
                
                return {then}
            };
            
            return {
                start(finish){
                    workQueue(([queue]) => {
                        return [...queue].sort(([x,y,p,i], [x2,y2,p2,i2]) => i-i2);
                    }).then(finish);
                },
                end(finish){
                    workQueue(([queue]) => {
                        return [...queue].sort(([x,y,p,i], [x2,y2,p2,i2]) => i2-i);
                    }).then(finish);
                },
                rand(finish){
                    workQueue(([queue]) => {
                        return [...queue].sort(() => Math.random()-.5);
                    }).then(finish);
                },
                
                
                
                top(finish){
                    workQueue(([queue]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => y-y2);
                    }).then(finish);
                },
                left(finish){
                    workQueue(([queue]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => x-x2);
                    }).then(finish);
                },
                right(finish){
                    workQueue(([queue]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => x2-x);
                    }).then(finish);
                },
                bottom(finish){
                    workQueue(([queue]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => y2-y);
                    }).then(finish);
                },
                
                
                
                fromCenter(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => 
                            ((x-cx)**2+(y-cy)**2) - 
                            ((x2-cx)**2+(y2-cy)**2)
                        );
                    }, cx, cy).then(finish);
                },
                toCenter(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => 
                            ((x2-cx)**2+(y2-cy)**2) - 
                            ((x-cx)**2+(y-cy)**2)
                        );
                    }, cx, cy).then(finish);
                },
                
                
                
                fromVertical(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => Math.abs(x-cx) - Math.abs(x2-cx));
                    }, cx, cy).then(finish);
                },
                fromHorizontal(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => Math.abs(y-cy) - Math.abs(y2-cy));
                    }, cx, cy).then(finish);
                },
                
                
                
                toVertical(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => Math.abs(x2-cx) - Math.abs(x-cx));
                    }, cx, cy).then(finish);
                },
                toHorizontal(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => Math.abs(y2-cy) - Math.abs(y-cy));
                    }, cx, cy).then(finish);
                },
                
                
                
                
                
                fromMapCenter(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => 
                            ((x-cx)**2+(y-cy)**2) - 
                            ((x2-cx)**2+(y2-cy)**2)
                        );
                    }, client.map.width/2, client.map.height/2).then(finish);
                },
                toMapCenter(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => 
                            ((x2-cx)**2+(y2-cy)**2) - 
                            ((x-cx)**2+(y-cy)**2)
                        );
                    }, client.map.width/2, client.map.height/2).then(finish);
                },
                
                
                
                fromMapVertical(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => Math.abs(x-cx) - Math.abs(x2-cx));
                    }, client.map.width/2, client.map.height/2).then(finish);
                },
                fromMapHorizontal(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => Math.abs(y-cx) - Math.abs(y2-cx));
                    }, client.map.width/2, client.map.height/2).then(finish);
                },
                
                
                
                toMapVertical(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => Math.abs(x2-cx) - Math.abs(x-cx));
                    }, client.map.width/2, client.map.height/2).then(finish);
                },
                toMapHorizontal(finish){
                    workQueue(([queue, cx, cy]) => {
                        return [...queue].sort(([x,y], [x2,y2]) => Math.abs(y2-cx) - Math.abs(y-cx));
                    }, client.map.width/2, client.map.height/2).then(finish);
                },
            };
        },
        
        
        
        timer: window,
        pixel: 0,
        size: 1,
        innerSize: 0,
        speed: 100,
        map: {pixels:[],width:0,height:0,get(x,y){return 255}},
        
        square(x,y, callback, finish) {
            const {pixel, timer, speed, size, innerSize} = this;
            const half = size>>1;
            const innerHalf = innerSize>>1;
            let xi = -half;
            let yi = -half;
            
            let t = timer.setInterval(() => {
                let i = 0;
                
                for (; yi < half+1;) {
                    for (; xi < half+1;) {
                        if (pixel === 255 || xi > -innerHalf && xi < innerHalf && yi > -innerHalf && yi < innerHalf) {
                            xi++;
                            continue;
                        }
                        
                        callback(x+xi, y+yi, pixel, t);
                        xi++;
                        
                        i++;
                        if (i > speed) return;
                        continue;
                    }
                    yi++;
                    xi = -half;
                }
                
                timer.clearInterval(t);
                finish&&finish();
            });
            
            return t;
        },
        
        
        
        ring(x,y, callback, finish) {
            const {pixel, timer, speed, size, innerSize} = this;
            const half = size>>1;
            const innerHalf = innerSize>>1;
            let xi = -half;
            let yi = -half;
            
            let t = timer.setInterval(() => {
                let i = 0;
                
                for (; yi < half+1;) {
                    for (; xi < half+1;) {
                        if (pixel === 255 || xi**2 + yi**2 > half**2 || xi**2 + yi**2 < innerHalf**2) {
                            xi++;
                            continue;
                        }
                        
                        callback(x+xi, y+yi, pixel, t);
                        xi++;
                        
                        i++;
                        if (i > speed) return;
                        continue;
                    }
                    yi++;
                    xi = -half;
                }
                
                timer.clearInterval(t);
                finish&&finish();
            });
            
            return t;
        },
        
        
        
        shader(callback, finish) {
            const {timer, speed, map} = this;
            let pos = 0;
            
            let t = timer.setInterval(() => {
                let i = 0;
                
                for (; pos < map.pixels.length; ) {
                    if (map.pixels[pos] === 255) {
                        pos++;
                        continue;
                    }
                    
                    callback(pos%map.width, pos/map.width>>0, map.pixels[pos], t);
                    pos++;
                    
                    i++;
                    if (i > speed) return;
                    continue;
                }
                
                timer.clearInterval(t);
                finish&&finish();
            });
            
            return t;
        },
        
        
        
        image(pixels, x,y,w,h, callback, finish) {
            const {timer, speed} = this;
            let xi = 0;
            let yi = 0;
            
            let t = timer.setInterval(() => {
                let i = 0;
                
                for (; yi < h;) {
                    for (; xi < w;) {
                        const pixel = pixels[xi+yi*w];
                        
                        if (pixel === 255) {
                            xi++;
                            continue;
                        }
                        
                        callback(x+xi, y+yi, pixel, t);
                        xi++;
                        
                        i++;
                        if (i > speed) return;
                        continue;
                    }
                    yi++;
                    xi = 0;
                }
                
                timer.clearInterval(t);
                finish&&finish();
            });
            
            return t;
        }
    };



    window.PPT = PPT;
    return PPT;
})();
// 0vC4#7152