class_name ByteStream var bytes: PackedByteArray var position: int = 0 @warning_ignore("shadowed_variable") static func from_bytes(bytes: PackedByteArray) -> ByteStream: var byte_stream = ByteStream.new() byte_stream.bytes = bytes return byte_stream @warning_ignore("shadowed_variable") func seek(position: int) -> void: if position > 0: assert(position <= bytes.size()) self.position = position func advance(jumps: int) -> void: position += jumps func available() -> bool: return position < bytes.size() - 1 func get_buffer(length: int) -> ByteStream: var byte_stream = ByteStream.from_bytes( bytes.slice(position, position + length) ) seek(position + length) return byte_stream func decode_u8() -> int: var result = bytes.decode_u8(position) seek(position + 1) return result func decode_u16() -> int: var result = bytes.decode_u16(position) seek(position + 2) return result func decode_u32() -> int: var result = bytes.decode_u32(position) seek(position + 4) return result func decode_u64() -> int: var result = bytes.decode_u64(position) seek(position + 8) return result func decode_s8() -> int: var result = bytes.decode_s8(position) seek(position + 1) return result func decode_s16() -> int: var result = bytes.decode_s16(position) seek(position + 2) return result func decode_s32() -> int: var result = bytes.decode_s32(position) seek(position + 4) return result func decode_s64() -> int: var result = bytes.decode_s64(position) seek(position + 8) return result func decode_float() -> float: var result = bytes.decode_float(position) seek(position + 4) return result func get_string_from_utf8(length: int) -> String: return get_buffer(length).bytes.get_string_from_utf8()