您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
To understand data of messages you send
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greatest.deepsurf.us/scripts/539331/1638884/BumpyballioPucksio%20Decoder.js
// ==UserScript== // @name Bumpyball.io/Pucks.io Decoder // @namespace https://greatest.deepsurf.us/en/users/1462379-3lectr0n-nj // @version 1 // @description To understand data of messages you send // @author 3lectr0N!nj@ // @grant none // ==/UserScript== let Packet = window.packet = { 0:{}, 1:{ 8: ["PacketId","int"], 18: ["Data","dict",{ 10: ["name", "string"], 18: ["uid", "string"], 24: ["version", "uint"], 32: ["skinId", "uint"], 42: ["password", "string"], 56: ["authenticationMethod", "uint"], }] }, 2:{ 8: ["PacketId","int"], 18: ["Data","dict",{ 10: ["entities", "dict", { 10: ["list", "arr", { 8: ["id", "int"], 18: ["entity", "dict", { 10: ["position", "dict", { 13: ["x", "float"], 21: ["z", "float"], }], 16: ["entityType", "uint"], 24: ["playerId", "uint"], 37: ["rotation", "float"], 42: ["forces", "dict", { 13: ["x", "float"], 21: ["z", "float"], }], }], }], }], 18: ["players", "dict", { 10: ["list", "arr", { 8: ["id", "int"], 18: ["name", "string"], 56: ["bot", "bool"], 24: ["goals", "uint"], 32: ["assits", "uint"], 40: ["team", "uint"], 48: ["skinId", "uint"], 64: ["experience", "uint"], }] }], 24: ["playerId", "uint"], 34: ["gameState", "dict", { 13: ["timeRemaining", "float"], 18: ["teams", "arr", { 8: ["teamId", "int"], 16: ["score", "int"], }], 24: ["gameState", "int"], }], 42: ["hostName", "string"] }] }, 3:{ 8: ["PacketId","int"], 18: ["Data","dict",{ 10: ["list", "arr", { 8: ["id", "int"], 18: ["name", "string"], 56: ["bot", "int"], 24: ["goals", "uint"], 32: ["assits", "uint"], 40: ["team", "uint"], 48: ["skinId", "uint"], 64: ["experience", "uint"], }] }] }, 4:{ 8: ["PacketId", "uint"], 18: ["Data", "dict",{ 8: ["playerId", "uint"], }] }, 5:{ 8: ["PacketId","int"], 18: ["Data","dict",{ 8: ["playerId", "uint"], 18: ["message", "string"] }] }, 6:{ 8: ["PacketId","int"], 18: ["Data","dict",{ 8: ["id", "uint"], 18: ["position", "dict", { 13: ["x", "float"], 21: ["z", "float"] }], 29: ["rotation", "float"], }] }, 7:{ 8: ["PacketId", "int"], 18: ["Data", "dict",{ 8: ["command", "bool"], 18: ["position", "dict", { 13: ["x", "float"], 21: ["z", "float"], }], 24: ["EID", "uint"], }] }, 8:{ 8: ["PacketId", "int"], 18: ["Data", "dict",{ 16: ["id", "uint"], 26: ["entity", "dict", { 10: ["position", "dict", { 13: ["x", "float"], 21: ["z", "float"], }], 16: ["entityType", "uint"], 24: ["playerId", "uint"], 37: ["rotation", "float"], 42: ["forces", "dict", { 13: ["x", "float"], 21: ["z", "float"], }], }] }] }, 9:{ 8: ["PacketId", "uint"], 18: ["Data", "dict",{ 8: ["id", "uint"], 24: ["reason", "uint"], 18: ["entity", "dict", { 10: ["position", "dict", { 13: ["x", "float"], 21: ["z", "float"], }], 24: ["playerId", "uint"], 16: ["entityType", "uint"], 37: ["rotation", "float"], 42: ["forces", "dict", { 13: ["x", "float"], 21: ["z", "float"], }], }], }] }, 10:{}, 11:{ 8: ["PacketId","int"], 18: ["Data","dict",{ 10: ["message", "string"], 16: ["playerIdA", "uint"], 24: ["playerIdB", "uint"], }] }, 12:{ 8: ["PacketId", "int"], 18: ["Data", "dict",{ 13: ["timeRemaining", "float"], 18: ["teams", "arr", { 8: ["teamId", "int"], 16: ["score", "int"], }], 24: ["gameState", "int"], }] }, 13:{ 8: ["PacketId", "int"], 18: ["Data", "dict",{ 8: ["team", "uint"], 16: ["id", "uint"] }] }, 14:{ 8: ["PacketId","int"], 18: ["Data","dict",{ 10: ["list", "arr", { 8: ["id", "int"], 18: ["name", "string"], 56: ["bot", "bool"], 24: ["goals", "uint"], 32: ["assits", "uint"], 40: ["team", "uint"], 48: ["skinId", "uint"], 64: ["experience", "uint"], }], }] }, 15:{ 8: ["PacketId","int"], 18: ["Data","dict",{ 16: ["playerId", "uint"], }] }, 16:{}, 17:{ 8: ["PacketId","int"], 18: ["Data","dict",{ 10: ["player","dict",{ 10: ["uid","string"], 34: ["name","string"], 40: ["goals","int"], 48: ["assits","int"], 56: ["wins","int"], 64: ["draws","int"], 72: ["lost","int"], 80: ["spareExp","int"], 88: ["exp","int"], 96: ["skinId","int"] }], }] }, 18:{}, 19:{} } class BR { arr=[]; i=0; constructor (a) { a??=[]; this.arr = [...a]; } skip(){ return (this.arr.length - this.i) ; } rbs (size){ let r = this.arr.slice(this.i,this.i+size); this.i+=size; return r ; } rb (){ return this.rbs(1)[0] } int7(){ let r = 0; let b = 0; while (b !== 35) { let c = this.rb(); r |= (c & 127) << b; if ((c & 128) === 0) { return [r, (b / 7) + 1]; } b += 7;} } str(){ let l = this.int7()[0] let s = new TextDecoder().decode(new Uint8Array(this.rbs(l))) return s } f32(){ let l = new Uint8Array(this.rbs(4)) let f = new Float32Array(l.buffer)[0] return f } dec(json){ let l let s let arrs=[] let v let obj ={}; for (let byte in json) { let [keyName, valueType] = json[byte]; if (["int", "bool", "uint","float"].includes(valueType)) { obj[byte] = [keyName,valueType,0]; } } for (let byte in json) { byte = Number(byte) let [keyName, valueType] = json[byte]; } while(this.skip()>0){ let byte = this.rb() let [keyName,valueType] = json[byte] let value switch(valueType){ case "int": case "uint": case "bool": value = this.int7()[0]; break; case "string": value =this.str(); break; case "float": value =this.f32(); break; case "dict": l = this.int7()[0] s = new BR(new Uint8Array(this.rbs(l))) value = s.dec(json[byte][2]) break; case "arr": l = this.int7()[0] s = new BR(new Uint8Array(this.rbs(l))) v = s.dec(json[byte][2]) arrs.push(v) value = arrs } obj[byte] = [keyName,valueType,value]; } return obj } bit7(num){ for(;num>=128;num>>=7)this.arr.push((128|num)%256);return this.arr.push(num%256) } ft32(num){ let f = new Float32Array([num]) let b = new Uint8Array(f.buffer) this.arr.push(...b) } istr(value){ let s = new TextEncoder().encode(value) this.arr.push(s.length,...s) } ab(value){ this.arr.push(value) } enc(json){ for (let byte in json) { let [keyName,valueType,value] = json[byte] let da let a switch(value){ case 0: valueType = "" } switch(valueType){ case "int": case "uint": case "bool": this.ab(Number(byte)) this.bit7(value) break; case "string": this.ab(Number(byte)) this.istr(value); break; case "float": this.ab(Number(byte)) this.ft32(value); break; case "dict": da = new BR([]).enc(json[Number(byte)][2]) this.ab(Number(byte)) this.bit7(da.length) this.arr.push(...da) break; case "arr": value.forEach(index=>{ a = new BR([]).enc(index) this.ab(Number(byte)) this.bit7(a.length) this.arr.push(...a) }) } } return this.arr } Sdecoder(d){ let json ={} let sd = new BR(d) json = sd.dec(Packet[d[1]]) return json } Sencoder(j){ let a =[] a = new BR([]).enc(j) return a } Mdecoder(d){ let j = {} let r=(-1) let s let wa = new BR(d) while(wa.skip()>0){ wa.rb() let l = wa.int7()[0] let a = wa.rbs(l) let s = new BR().Sdecoder(a) j[r+=1] = s } return j } Mencoder(j){ let a_ let a =[] for (let b in j) { let _j = j[b] a_ = new BR([]).Sencoder(_j) let le = new BR([]) le.bit7(a_.length) let l = le.arr a.push(10,...l,...a_) } return a } } window.BR = BR