您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
RocketBall Decoder Buffer
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/448028/1071234/RBDB.js
// ==UserScript== // @name RBDB // @version 1.0 // @author 0vC4 // @description RocketBall Decoder Buffer // @namespace http://greasyfork.icu/users/670183-exnonull // @license MIT // ==/UserScript== class ReadBuffer { offset = 0 buffer = [] finish = false constructor(packet) { this.buffer = [...packet]; this.offset = 0 } next(size=1) { let offset = this.offset; this.offset += size; if (this.offset == this.buffer.length) this.finish = true; return offset; } get skip8() { this.u8; return this; } get skip16() { this.u16; return this; } get skip32() { this.u32; return this; } get skip64() { this.u64; return this; } get skip7() { this.int7; return this; } get skipString() { this.string; return this; } get u8() { return new Uint8Array([this.buffer[this.next()]])[0]; } get u16() { return new Uint16Array(new Uint8Array(this.buffer.slice(this.next(2), this.offset)).buffer)[0]; } get u32() { return new Uint32Array(new Uint8Array(this.buffer.slice(this.next(4), this.offset)).buffer)[0]; } get u64() { return new BigUint64Array(new Uint8Array(this.buffer.slice(this.next(8), this.offset)).buffer)[0]; } get s8() { return new Int8Array([this.buffer[this.next()]])[0]; } get s16() { let offset = this.offset; this.offset += 2; if (this.offset == this.buffer.length) this.finish = true; return new Int16Array(new Uint8Array(this.buffer.slice(this.next(2), this.offset)).buffer)[0]; } get s32() { return new Int32Array(new Uint8Array(this.buffer.slice(this.next(4), this.offset)).buffer)[0]; } get s64() { return new BigInt64Array(new Uint8Array(this.buffer.slice(this.next(8), this.offset)).buffer)[0]; } get f32() { return new Float32Array(new Uint8Array(this.buffer.slice(this.next(4), this.offset)).buffer)[0]; } get f64() { return new Float64Array(new Uint8Array(this.buffer.slice(this.next(8), this.offset)).buffer)[0]; } get int7() { let offset = 0; let num = 0; while (offset != 0b100011) { let byte = this.buffer[this.offset + offset/7]; num |= (byte&0x7f)<<offset; offset += 7; if ((byte&0x80) == 0) { this.next(offset/7); return num; } } this.next(offset/7); return num; } get string() { return new TextDecoder().decode(this.buffer.slice(this.next(this.int7), this.offset)); } get array() { return new Uint8Array(this.buffer.slice(this.next(this.buffer.length-this.offset), this.offset)); } } class WriteBuffer { offset = 0 buffer = [] constructor(buffer) { this.buffer = [...buffer]; this.offset = buffer.length; } u8(...nums) { for (let byte of new Uint8Array([...nums])) this.buffer[this.offset++] = byte; return this; } u16(...nums) { for (let byte of new Uint8Array(new Uint16Array([...nums]).buffer)) this.buffer[this.offset++] = byte; return this; } u32(...nums) { for (let byte of new Uint8Array(new Uint32Array([...nums]).buffer)) this.buffer[this.offset++] = byte; return this; } u64(...nums) { for (let byte of new Uint8Array(new BigUint64Array([...nums]).buffer)) this.buffer[this.offset++] = byte; return this; } s8(...nums) { for (let byte of new Uint8Array([...nums])) this.buffer[this.offset++] = byte; return this; } s16(...nums) { for (let byte of new Uint8Array(new Int16Array([...nums]).buffer)) this.buffer[this.offset++] = byte; return this; } s32(...nums) { for (let byte of new Uint8Array(new Int32Array([...nums]).buffer)) this.buffer[this.offset++] = byte; return this; } s64(...nums) { for (let byte of new Uint8Array(new BigInt64Array([...nums]).buffer)) this.buffer[this.offset++] = byte; return this; } f32(...nums) { for (let byte of new Uint8Array(new Float32Array([...nums]).buffer)) this.buffer[this.offset++] = byte; return this; } f64(...nums) { for (let byte of new Uint8Array(new Float64Array([...nums]).buffer)) this.buffer[this.offset++] = byte; return this; } int7(...nums) { const bytes = []; for (let num of nums) { while(num >= 0x80) { num >>= 7; bytes.push((num|0x80)%0x100); } bytes.push(num%0x100); } for (let byte of bytes) this.buffer[this.offset++] = byte; return this; } string(...strs) { for (let str of strs) { str = new TextEncoder().encode(str); this.int7(str.length); for (let byte of new TextEncoder().encode(str)) this.buffer[this.offset++] = new Uint8Array([byte])[0]; } return this; } array(bytes) { for (let byte of bytes) this.buffer[this.offset++] = new Uint8Array([byte])[0]; return this; } } // 0vC4#7152