teeworlds
Version:
Library for (ingame) teeworlds bots.
59 lines (47 loc) • 1.52 kB
text/typescript
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;
}
}