UNPKG

teeworlds

Version:

Library for (ingame) teeworlds bots.

59 lines (47 loc) 1.52 kB
const decoder = new TextDecoder('utf-8'); export function unpackInt(pSrc: Buffer): {result: number, remaining: Buffer} { var srcIndex = 0; const sign = ((pSrc[srcIndex] >> 6) & 1) var result = (pSrc[srcIndex] & 0b0011_1111) while (srcIndex <= 4) { if ((pSrc[srcIndex] & 0b1000_0000) === 0) break; srcIndex++; result |= ((pSrc[srcIndex] & 0b0111_1111)) << (6+7*(srcIndex-1)) } result ^= -sign; return {result, remaining: pSrc.slice(srcIndex+1)}; } export function unpackString(pSrc: Buffer): {result: string, remaining: Buffer} { var result = pSrc.slice(0, pSrc.indexOf(0)) pSrc = pSrc.slice(pSrc.indexOf(0) + 1, pSrc.length) return {result: decoder.decode(new Uint8Array(result)), remaining: pSrc} } export class MsgUnpacker { remaining: Buffer; constructor(pSrc: Buffer) { this.remaining = pSrc; } unpackInt(): number { // let unpacked; // if (!_unpacked) { let unpacked = unpackInt(this.remaining); this.remaining = unpacked.remaining; // } else { // unpacked = {result: this.remaining[0]}; // this.remaining = this.remaining.slice(1); // } return unpacked.result; } unpackString(): string { let unpacked = unpackString(this.remaining); this.remaining = unpacked.remaining; return unpacked.result; } /** @param size - size in bytes */ unpackRaw(size: number): Buffer { let unpacked = this.remaining.slice(0, size); this.remaining = this.remaining.slice(size); return unpacked; } }