Shuubaru Posted May 8, 2018 Share Posted May 8, 2018 (edited) 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! Edited May 8, 2018 by [?]Itachi Link to comment
Shuubaru Posted May 8, 2018 Author Share Posted May 8, 2018 ya logre solucionarlo, porfa cierren el tema! por alguna razon ya no puedo editarlo Link to comment
Platin Posted May 13, 2018 Share Posted May 13, 2018 Se que ya solucionaste tú tema, pero todavía no entiendo cual fue tu problema con los ZIP. Espero y en tú servidor no estés poniendo los zips directo a la carpeta de resources, ya que esto te va a generar una carpeta el re dope en otro directorio, donde va a estar descomprimido. También estaría bueno que dejes la solución para que otros la puedan encontrar a futuro. Suerte. Link to comment
Shuubaru Posted May 27, 2018 Author Share Posted May 27, 2018 On 13/5/2018 at 12:44, Platin - xNikoXD said: Se que ya solucionaste tú tema, pero todavía no entiendo cual fue tu problema con los ZIP. Espero y en tú servidor no estés poniendo los zips directo a la carpeta de resources, ya que esto te va a generar una carpeta el re dope en otro directorio, donde va a estar descomprimido. También estaría bueno que dejes la solución para que otros la puedan encontrar a futuro. Suerte. Creo que ahi dice bien claro cual era mi problema con los zips: el modulo para extraerlos generaba un loop gigantesco el cual MTA aborta. Con la ayuda de un par de tutoriales de coroutines logre hacerlo. Mi intencion era hacer un sistema de subida de archivos de la mano con dropbox, la verdad dudo que alguien alguna vez implemente esto por 3 razones algo triviales, la primera es el uso de CPU para extraer archivos de mas de 2mb, la segunda que para los jugadores esto podria ser algo tedioso (sobretodo para el jugador promedio de MTA que se le rompe el mundo cuando un server pesa mas de 20mb), y la tercera que la mayoria usan subidas desde las web de los servidores y se ahorran todo este trabajo. Esto en todo caso no fue mas que un experimento para ver si es que era posible hacer todo este sistema, y vaya que lo fue. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now