Diep.io Automation Pack

automates important constants for diep.io

目前为 2022-12-30 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/457231/1133348/Diepio%20Automation%20Pack.js

  1. // ==UserScript==
  2. // @name Diep.io Automation Pack
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description automates important constants for diep.io
  6. // @author bismuth
  7. // @match https://diep.io/
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=diep.io
  9. // @license MIT
  10. // @grant none
  11. // ==/UserScript==
  12. class Automator {
  13. constructor() {
  14. Automator.config = this.config = {};
  15. }
  16. async getConfig(bin) {
  17. const buildFetch = async () => {
  18. const res = await fetch("https://diep.io/", { cache: "no-cache" });
  19. const text = await res.text();
  20. const JS_PATH = text.slice(text.indexOf("src=\"/index.") + "src=\"/".length, text.indexOf("\">", text.indexOf("src=\"/index.")));
  21. const wasm2js = await fetch("https://diep.io/" + JS_PATH).then(res => res.text());
  22. return wasm2js.slice(wasm2js.lastIndexOf("\"", wasm2js.indexOf(".wasm\"")) + 1, wasm2js.indexOf(".wasm\""));
  23. }
  24. const build = await buildFetch();
  25. try { Automator.config = this.config = JSON.parse(window.localStorage.config) }
  26. catch { this.config = {}; }
  27. if (this.config.build !== build) {
  28. const wasmRegex = (regex, repeat = false, start = 0) => {
  29. let ret = [], rets = [];
  30. jump: for (let n = start; n < this.packet.length - regex.length; n++) {
  31. this.index = n;
  32. ret = [];
  33. for (let p = 0; p < regex.length; p++) {
  34. if (regex[p] === '*') this.vu();
  35. else if (regex[p] === '+') ret.push(this.vu());
  36. else if (this.u8() !== regex[p]) continue jump;
  37. }
  38. if (repeat) rets.push(ret);
  39. else return ret;
  40. }
  41. return rets.length? rets: false;
  42. }
  43. const unreachable = 0x00, nop = 0x01, block = 0x02, loop = 0x03, if_ = 0x04, else_ = 0x05, end = 0x0b, br = 0x0c, br_if = 0x0d,
  44. call = 0x10, drop = 0x1a,
  45. local_get = 0x20, local_set = 0x21, local_tee = 0x22, global_get = 0x23, global_set = 0x24, i32_load = 0x28, f32_load = 0x2a, f64_load = 0x2b, i32_load8_s = 0x2c, i32_load8_u = 0x2d, i32_load16_u = 0x2f,
  46. i32_store = 0x36, i64_store = 0x37, f32_store = 0x38, i32_store8 = 0x3a, i32_store16 = 0x3b,
  47. memory_grow = 0x40, i32_const = 0x41, i64_const = 0x42, i32_eqz = 0x45, i32_eq = 0x46, i32_lt_s = 0x48, i32_lt_u = 0x49,
  48. f32_eq = 0x5b, f32_lt = 0x5d, f32_gt = 0x5e,
  49. i32_add = 0x6a, i32_sub = 0x6b,
  50. i32_and = 0x71, i32_or = 0x72, i32_xor = 0x73,
  51. f32_sub = 0x93, f32_mul = 0x94,
  52. f32_demote_f64 = 0xb6;
  53. const i32 = 0x7f, i64 = 0x7e, f32 = 0x7d, f64 = 0x4c;
  54. const param = 0x01, local = 0x02;
  55. const fieldMap = JSON.parse(atob('W29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLCxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0sW29iamVjdCBPYmplY3RdLFtvYmplY3QgT2JqZWN0XSxbb2JqZWN0IE9iamVjdF0=wiZ3JvdXAiOjE1LCJtZW1UeXBlIjoiZjMyIiwicmVwZWF0IjoxLCJ1cGRhdGUiOiJmMzIifSx7Im5hbWUiOiJtb3RoZXJzaGlwWSIsInR5cGUiOiJmMzIiLCJncm91cCI6MTUsIm1lbVR5cGUiOiJmMzIiLCJyZXBlYXQiOjEsInVwZGF0ZSI6ImYzMiJ9LHsibmFtZSI6Im1vdGhlcnNoaXAiLCJ0eXBlIjoidnUiLCJncm91cCI6MTUsIm1lbVR5cGUiOiJpMzIiLCJyZXBlYXQiOjEsInVwZGF0ZSI6InZ1In1dXQ=='));
  56. const field_func = new Array(136).fill().map((_,ind) => ind & 1? '*': block);
  57. const fieldGroupMap = {};
  58. const fields = []; //key = index
  59. const _fields = {}; //key = name
  60. const funcs = [];
  61. let uptime, deletion, upcreate, rootVec, entPtr, animated, tankRootVec, recvPacketIndex;
  62. this.packet = new Uint8Array(bin);
  63. this.index = 8;
  64. while (this.index < this.packet.length) {
  65. const id = this.u8();
  66. const sectionLen = this.vu();
  67. if (id !== 10) {
  68. this.index += sectionLen;
  69. continue;
  70. }
  71. const bodyCount = this.vu();
  72. for (let i = 0; i < bodyCount; i++) {
  73. const len = this.vu();
  74. funcs.push(this.packet.slice(this.index, this.index += len));
  75. }
  76. break;
  77. }
  78. for (let n = 0; n < funcs.length; n++) {
  79. const funcBody = funcs[n];
  80. let regex;
  81. this.packet = funcBody;
  82. if (!uptime && (regex = wasmRegex([i32_const, '+',
  83. i32_xor,
  84. local_tee, '*',
  85. i32_store]))) uptime = regex[0];
  86. if (!upcreate && (regex = wasmRegex([local_get, '*',
  87. i32_const, '+',
  88. i32_add,
  89. i32_const, '*',
  90. i32_and,
  91. i32_xor]))) upcreate = regex[0];
  92. if (!deletion && (regex = wasmRegex([local_get, '*',
  93. i32_const, '+',
  94. i32_add,
  95. i32_const, '*',
  96. i32_and,
  97. local_tee, '*',
  98. local_get, '*',
  99. i32_xor]))) deletion = regex[0];
  100. if (!rootVec && (regex = wasmRegex([i32_const, '+',
  101. local_get, '*',
  102. call, '*',
  103. local_tee, '*',
  104. local_get, '*',
  105. i32_store16]))) { rootVec = regex[0] + 512; entPtr = rootVec + 208 }
  106. if (!animated && (regex = wasmRegex(new Array(4).fill().map(_ => [i32_const, '+',
  107. i32_load, '*', '*',
  108. local_set, '*',
  109. i32_const, '*',
  110. i32_const, '*',
  111. i32_store, '*', '*',
  112. '*', '*', '*', '*', '*', '*', '*', '*', '*']).flat()))) animated = {x: regex[3], y: regex[2], fov: regex[0] }
  113. if ((regex = wasmRegex(field_func, false))) {
  114. const groupDeclare = [...wasmRegex([local_get, '*',
  115. i32_load, '*', '+',
  116. local_set, '+'], true),
  117. ...wasmRegex([local_get, '*',
  118. i32_load, '*', '+',
  119. local_tee, '+'], true)];
  120. for (const [offset,varName] of groupDeclare) if (offset >= 72) fieldGroupMap[varName] = (offset - 72) >> 2;
  121. const fieldDeclare = wasmRegex([local_get, '+',
  122. i32_const, 0,
  123. i32_store8, '*', '+'], true);
  124. for (const [varName,offset] of fieldDeclare) {
  125. const group = fieldGroupMap[varName];
  126. const pos = offset-4;
  127. const field = fieldMap[group][pos];
  128. if (_fields[field.name]) continue;
  129. fields.push(field);
  130. _fields[field.name] = field;
  131. }
  132. }
  133. }
  134. const fieldGroupOffsets = [8, 0, 8, 12, 8, 0, 8, 8, 20, 8, 28, 8, 12, 0, 8, 8];
  135. const fieldGroupOrder = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]];
  136. const typeLengths = {"f32": 8,"_f32":32,"i32":8,"entid":12,"str":16};
  137. for (let n = 0; n < fields.length; n++) {
  138. const val = fields[n];
  139. if (!val.name) continue;
  140. if (val.memType === '_f32') fieldGroupOffsets[val.group] += fieldGroupOffsets[val.group] & 4;
  141. _fields[val.name].offset = val.offset = fieldGroupOffsets[val.group];
  142. val.groupOffset = 72 + (val.group << 2);
  143. fieldGroupOffsets[val.group] += typeLengths[val.memType] * val.repeat;
  144. fieldGroupOrder[val.group].push(n);
  145. }
  146. const lastUpdatedAt = new Date().toString();
  147. Automator.config = this.config = {
  148. build,
  149. fieldMap,
  150. fields,
  151. _fields,
  152. uptime,
  153. deletion,
  154. upcreate,
  155. rootVec,
  156. entPtr,
  157. fieldGroupOrder,
  158. animated,
  159. lastUpdatedAt
  160. };
  161. window.localStorage.config = JSON.stringify(this.config);
  162. console.log(`%cfinished automation for build ${build}`, 'color: red; font-weight: bold');
  163. return this.config;
  164. }
  165. }
  166. u8() { return this.packet[this.index++] }
  167. vu() {
  168. let out = 0, at = 0;
  169. while (this.packet[this.index] & 0x80) {
  170. out |= (this.u8() & 0x7f) << at;
  171. at += 7;
  172. }
  173. out |= this.u8() << at;
  174. return out;
  175. }
  176. }