PPT

Pixel Place Tools

当前为 2022-04-30 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.gf.qytechs.cn/scripts/443807/1045815/PPT.js

  1. // ==UserScript==
  2. // @name PPT
  3. // @description Pixel Place Tools
  4. // @version 2.2.1
  5. // @author 0vC4
  6. // @namespace https://gf.qytechs.cn/users/670183
  7. // @match https://pixelplace.io/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=pixelplace.io
  9. // @license MIT
  10. // @grant none
  11. // @run-at document-start
  12. // ==/UserScript==
  13.  
  14.  
  15.  
  16.  
  17.  
  18. const PPT = (() => {
  19. if (window.PPT) return window.PPT;
  20.  
  21.  
  22.  
  23. const worker = function(func) {
  24. const worker = new Worker(URL.createObjectURL(new Blob(["onmessage=async({data})=>self.postMessage(await(" + func.toString() + ")(data))"], { type: "text/javascript" })));
  25. const root = {};
  26. const post = data => (worker.postMessage(data), root);
  27. const then = callback => (worker.onmessage=({data})=>callback(data), root);
  28. return Object.assign(root, {post, then});
  29. };
  30.  
  31.  
  32.  
  33. const PPT = {
  34. zero: 0xCCCCCC,
  35. default: new Uint32Array([
  36. 0xFFFFFF,
  37. 0xC4C4C4,
  38. 0x888888,
  39. 0x555555,
  40. 0x222222,
  41. 0x000000,
  42. 0x006600,
  43. 0x22B14C,
  44. 0x02BE01,
  45. 0x51E119,
  46. 0x94E044,
  47. 0xFBFF5B,
  48. 0xE5D900,
  49. 0xE6BE0C,
  50. 0xE59500,
  51. 0xA06A42,
  52. 0x99530D,
  53. 0x633C1F,
  54. 0x6B0000,
  55. 0x9F0000,
  56. 0xE50000,
  57. 0xFF3904,
  58. 0xBB4F00,
  59. 0xFF755F,
  60. 0xFFC49F,
  61. 0xFFDFCC,
  62. 0xFFA7D1,
  63. 0xCF6EE4,
  64. 0xEC08EC,
  65. 0x820080,
  66. 0x5100FF,
  67. 0x020763,
  68. 0x0000EA,
  69. 0x044BFF,
  70. 0x6583CF,
  71. 0x36BAFF,
  72. 0x0083C7,
  73. 0x00D3DD,
  74. 0x45FFC8
  75. ]),
  76. exclude: new Uint32Array([
  77. 0x51E119,
  78. 0xFF3904,
  79. 0x5100FF,
  80. 0x45FFC8
  81. ]),
  82. get palette() {
  83. return this.default.map(color => this.exclude.includes(color) ? this.zero : color);
  84. },
  85.  
  86.  
  87.  
  88. _wheelID: 0,
  89. get wheel() {
  90. let pixel = this._wheelID+1;
  91.  
  92. while (this.palette[pixel] == this.zero)
  93. if (this.palette[++pixel] == null)
  94. pixel = 0;
  95.  
  96. this._wheelID = pixel;
  97. return this._wheelID;
  98. },
  99.  
  100.  
  101.  
  102. RGB2P(r, g, b) {
  103. const closest = [...this.palette]
  104. .filter(n => n != this.zero)
  105. .map(clr =>
  106. [
  107. ((r - ((clr>>16)&0xFF))*.299)**2 +
  108. ((g - ((clr>>8)&0xFF))*.587)**2 +
  109. ((b - (clr&0xFF))*.114)**2,
  110. clr
  111. ]
  112. )
  113. .sort((a,b) => a[0]-b[0])
  114. [0][1];
  115.  
  116. return this.palette.indexOf(closest);
  117. },
  118. CLR2P(color) {
  119. return this.RGB2P((color>>16)&0xFF, (color>>8)&0xFF, color&0xFF);
  120. },
  121. client: null,
  122. get order() {
  123. if (!this.client) throw new Error('assign client variable first');
  124. const queue = this.client._pixelQueue;
  125. const [cx, cy] = queue.reduce(([x,y], [x2,y2]) => {
  126. if (!x) return [x2,y2];
  127. return [(x+x2)/2, (y+y2)/2];
  128. }, [0, 0]).map(Math.floor);
  129. const workQueue = (func, ...args) => {
  130. let fin = queue => 0;
  131. const then = finish => finish && (fin = finish);
  132. worker(func)
  133. .then(queue => fin(this.client._pixelQueue = queue))
  134. .post([queue, ...args]);
  135. return {then}
  136. };
  137. return {
  138. start(finish){
  139. workQueue(([queue]) => {
  140. return [...queue].sort(([x,y,p,i], [x2,y2,p2,i2]) => i-i2);
  141. }).then(finish);
  142. },
  143. end(finish){
  144. workQueue(([queue]) => {
  145. return [...queue].sort(([x,y,p,i], [x2,y2,p2,i2]) => i2-i);
  146. }).then(finish);
  147. },
  148. rand(finish){
  149. workQueue(([queue]) => {
  150. return [...queue].sort(() => Math.random()-.5);
  151. }).then(finish);
  152. },
  153. top(finish){
  154. workQueue(([queue]) => {
  155. return [...queue].sort(([x,y], [x2,y2]) => y-y2);
  156. }).then(finish);
  157. },
  158. left(finish){
  159. workQueue(([queue]) => {
  160. return [...queue].sort(([x,y], [x2,y2]) => x-x2);
  161. }).then(finish);
  162. },
  163. right(finish){
  164. workQueue(([queue]) => {
  165. return [...queue].sort(([x,y], [x2,y2]) => x2-x);
  166. }).then(finish);
  167. },
  168. bottom(finish){
  169. workQueue(([queue]) => {
  170. return [...queue].sort(([x,y], [x2,y2]) => y2-y);
  171. }).then(finish);
  172. },
  173. fromCenter(finish){
  174. workQueue(([queue, cx, cy]) => {
  175. return [...queue].sort(([x,y], [x2,y2]) =>
  176. ((x-cx)**2+(y-cy)**2) -
  177. ((x2-cx)**2+(y2-cy)**2)
  178. );
  179. }, cx, cy).then(finish);
  180. },
  181. toCenter(finish){
  182. workQueue(([queue, cx, cy]) => {
  183. return [...queue].sort(([x,y], [x2,y2]) =>
  184. ((x2-cx)**2+(y2-cy)**2) -
  185. ((x-cx)**2+(y-cy)**2)
  186. );
  187. }, cx, cy).then(finish);
  188. },
  189. };
  190. },
  191. timer: window,
  192. pixel: 0,
  193. size: 1,
  194. innerSize: 0,
  195. speed: 100,
  196. map: {pixels:[],width:0,height:0,get(x,y){return 255}},
  197. square(x,y, callback, finish) {
  198. const {pixel, timer, speed, size, innerSize} = this;
  199. const half = size>>1;
  200. const innerHalf = innerSize>>1;
  201. let xi = -half;
  202. let yi = -half;
  203. let t = timer.setInterval(() => {
  204. let i = 0;
  205. for (; yi < half+1;) {
  206. for (; xi < half+1;) {
  207. if (pixel === 255 || xi > -innerHalf && xi < innerHalf && yi > -innerHalf && yi < innerHalf) {
  208. xi++;
  209. continue;
  210. }
  211. callback(x+xi, y+yi, pixel, t);
  212. xi++;
  213. i++;
  214. if (i > speed) return;
  215. continue;
  216. }
  217. yi++;
  218. xi = -half;
  219. }
  220. timer.clearInterval(t);
  221. finish&&finish();
  222. });
  223. return t;
  224. },
  225. ring(x,y, callback, finish) {
  226. const {pixel, timer, speed, size, innerSize} = this;
  227. const half = size>>1;
  228. const innerHalf = innerSize>>1;
  229. let xi = -half;
  230. let yi = -half;
  231. let t = timer.setInterval(() => {
  232. let i = 0;
  233. for (; yi < half+1;) {
  234. for (; xi < half+1;) {
  235. if (pixel === 255 || xi**2 + yi**2 > half**2 || xi**2 + yi**2 < innerHalf**2) {
  236. xi++;
  237. continue;
  238. }
  239. callback(x+xi, y+yi, pixel, t);
  240. xi++;
  241. i++;
  242. if (i > speed) return;
  243. continue;
  244. }
  245. yi++;
  246. xi = -half;
  247. }
  248. timer.clearInterval(t);
  249. finish&&finish();
  250. });
  251. return t;
  252. },
  253. shader(callback, finish) {
  254. const {timer, speed, map} = this;
  255. let pos = 0;
  256. let t = timer.setInterval(() => {
  257. let i = 0;
  258. for (; pos < map.pixels.length; ) {
  259. if (map.pixels[pos] === 255) {
  260. pos++;
  261. continue;
  262. }
  263. callback(pos%map.width, pos/map.width>>0, map.pixels[pos], t);
  264. pos++;
  265. i++;
  266. if (i > speed) return;
  267. continue;
  268. }
  269. timer.clearInterval(t);
  270. finish&&finish();
  271. });
  272. return t;
  273. },
  274. image(pixels, x,y,w,h, callback, finish) {
  275. const {timer, speed} = this;
  276. let xi = 0;
  277. let yi = 0;
  278. let t = timer.setInterval(() => {
  279. let i = 0;
  280. for (; yi < h;) {
  281. for (; xi < w;) {
  282. const pixel = pixels[xi+yi*w];
  283. if (pixel === 255) {
  284. xi++;
  285. continue;
  286. }
  287. callback(x+xi, y+yi, pixel, t);
  288. xi++;
  289. i++;
  290. if (i > speed) return;
  291. continue;
  292. }
  293. yi++;
  294. xi = 0;
  295. }
  296. timer.clearInterval(t);
  297. finish&&finish();
  298. });
  299. return t;
  300. }
  301. };
  302.  
  303.  
  304.  
  305. window.PPT = PPT;
  306. return PPT;
  307. })();
  308. // 0vC4#7152

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址