Search the Community
Showing results for tags 'coroutines'.
-
Hola buenas, a falta de la necesidad de un descompresor de archivos zip en mta (lo cual me sorprende que en pleno 2018 aun no tenga uno), me vi en la obligacion de usar una libreria existente. Necesito saber como reescribir parte de la funcion getb() puesto que el loop que genera en archivos superiores a 2mb puede llegar a ser realmente gigantesco y MTA por consiguiente termina abortandolo. He visto que hay formas de hacerlo con coroutines (pausandolas y resumiendolas), pero no logro entender como adaptar parte de las funciones que estan dentro de la funcion principal, puesto que estan en OOP, lo cual para mi sigue siendo medio chino. Ojalas me puedan echar una mano con esto, mas alla de que parte del codigo ya haya estado hecho, la verdad es que me tomo bastante tiempo adaptarlo a las funciones de MTA y escribir todo el resto, horas y horas de testeo. Se tambien que con debug.setHook(nil) se pueden forzar loops largos pero el lag que generaria realmente no lo compensa. -- file = string obtenido desde fileRead local function bitstream_init(file) local bs = { file = file, buf = nil, len = nil, pos = 1, b = 0, n = 0, } function bs:flushb(n) self.n = self.n - n self.b = bitRShift(self.b,n) end function bs:getb(n) while self.n < n do if self.pos > self.len then self.buf = self.file:read(4096) self.len = self.buf:len() self.pos = 1 end self.b = self.b + bitLShift(self.buf:byte(self.pos),self.n) self.pos = self.pos + 1 self.n = self.n + 8 end local ret = bitAnd(self.b,bitLShift(1,n)-1) self.n = self.n - n self.b = bitRShift(self.b,n) return ret end function bs:getv(hufftable,n) while self.n < n do if self.pos > self.len then self.buf = self.file:read(4096) self.len = self.buf:len() self.pos = 1 end self.b = self.b + bitLShift(self.buf:byte(self.pos),self.n) self.pos = self.pos + 1 self.n = self.n + 8 end local h = reverse[bitAnd(self.b,255)] local l = reverse[bitAnd(bitRShift(self.b,8),255)] local v = bitAnd(bitRShift(bitLShift(h,8)+l,16-n),bitLShift(1,n)-1) local e = hufftable[v] local len = bitAnd(e,15) local ret = bitRShift(e,4) self.n = self.n - len self.b = bitRShift(self.b,len) return ret end function bs:close() if self.file then self.file:close() end end if type(file) == "string" then bs.file = nil bs.buf = file end bs.len = bs.buf:len() return bs end Gracias de antemano!