您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Pixel Place Map Loader
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/443803/1042800/PPML.js
// ==UserScript== // @name PPML // @description Pixel Place Map Loader // @version 1.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 PPML = (() => { if (window.PPML) return window.PPML; const colors = new Uint32Array([ 0xCCCCCC, 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 ]); const PPML = { map: {}, ws: null, hooks: [], setHook(hook) { PPML.hooks.push(hook); }, setHooks(...hooks) { PPML.hooks.push(...hooks.flat()); }, hook: { priority: 0, init(){ if (PPML.ws) return arguments; PPML.ws = this; return arguments; }, message({data}) { if (PPML.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 => PPML.map.set(...p)); return arguments; }, }, _emitQueue: [], safeEmit(x,y,pixel) { PPML._emitQueue.push([x,y,pixel]); }, emit(x,y,pixel) { if (!PPML.ws) return; const pixel2 = PPML.map.get(x,y); if (pixel === pixel2 || pixel2 === 255) return false; CWSS.send.call(PPML.ws, `42["p",[${x},${y},${pixel},1]]`); return true; } }; WorkerTimer.setInterval(() => { while (PPML.emit(...PPML._emitQueue.shift()) === false); }, 1e3/5); CWSS.setHook(PPML.hook); const Img = window.Image; window.Image = function() { const img = new Img(...arguments); Object.defineProperty(img, 'src', { enumerable: true, configurable: true, set(val) { this.setAttribute('src', val); if (!val.match(/canvas\/\d+\.png\?/)) return; this.addEventListener('load', () => { const canvas = document.createElement('canvas'); canvas.width = this.width; canvas.height = this.height; const ctx = canvas.getContext('2d'); ctx.drawImage(this, 0, 0); const rgba = ctx.getImageData(0, 0, this.width, this.height).data; const pixels = new Uint8Array(rgba.length>>2); for (let i = 0; i < rgba.length; i += 4) pixels[i>>2] = colors.indexOf((rgba[i]<<16) + (rgba[i+1]<<8) + (rgba[i+2]))-1; const {width, height} = this; const map = { pixels, colors, width, height, find(pixel) { const pos = this.pixels.indexOf(pixel); if (pos > -1) return pos; return null; }, get(x,y) { return this.pixels[x+y*this.width]; }, set(x,y,pixel) { const offset = x+y*this.width; if (this.pixels[offset] == null) return; this.pixels[offset] = pixel; } }; Object.assign(PPML.map, map); PPML.hooks.sort((a,b) => b.priority - a.priority).map(h => h.init(map)); }); } }); return img; }; Object.assign(Image, Img); for (let k in Img.prototype) try {Image.prototype[k] = Img.prototype[k];} catch (e) {}; window.PPML = PPML; return PPML; })(); // 0vC4#7152