PromeTheuS Posted January 24, 2014 Report Share Posted January 24, 2014 Buenas alguien puede tener el plugins para el noesis? el python para el RIFT ONLINE, se agradecería mucho. Gracias. Link to comment Share on other sites More sharing options...
LuisCbr13 Posted January 24, 2014 Report Share Posted January 24, 2014 from inc_noesis import * import noesis import rapi import os import struct MODE = 1 def registerNoesisTypes(): '''Register the plugin. Just change the Game name and extension.''' handle = noesis.register("RFOnline", ".msh") noesis.setHandlerTypeCheck(handle, noepyCheckType) noesis.setHandlerLoadModel(handle, noepyLoadModel) return 1 def noepyCheckType(data): '''Verify that the format is supported by this plugin. Default yes''' if len(data) < 2: return 0 try: bs = NoeBitStream(data) idstring = noeStrFromBytes(bs.readBytes(6)) if idstring != "MESH08": bs.seek(0) numMesh = bs.readShort() if numMesh <= 0 or numMesh > 50: return 0 return 1 except: return 0 def get_type(data): bs = NoeBitStream(data) string = bs.readBytes(6) try: if noeStrFromBytes(string) == "MESH08": return 1 return 0 except: return 0 def load_all_models(mdlList): '''Load all models''' #carry over from previous models matList = [] texList = [] dirPath = rapi.getDirForFilePath(rapi.getInputName()) fileList = [file for file in os.listdir(dirPath) if file.lower().endswith(".msh")] for file in fileList: f = open(dirPath + file, 'rb') data2 = f.read() modelType = get_type(data2) if modelType == 0: parser = SanaeParser(data2) else: parser = RFParser(data2) parser.parse_file() matList.extend(parser.matList) texList.extend(parser.texList) mdl = rapi.rpgConstructModel() mdl.setModelMaterials(NoeModelMaterials(texList, matList)) mdlList.append(mdl) def load_single_model(data, mdlList): '''Loads a single model. For testing purposes''' modelType = get_type(data) if modelType == 0: parser = SanaeParser(data) else: parser = RFParser(data) parser.parse_file() mdl = rapi.rpgConstructModel() mdl.setModelMaterials(NoeModelMaterials(parser.texList, parser.matList)) mdlList.append(mdl) def noepyLoadModel(data, mdlList): '''Load the model''' ctx = rapi.rpgCreateContext() if MODE == 1: load_all_models(mdlList) else: load_single_model(data, mdlList) return 1 #def noepyLoadModel(data, mdlList): #'''Build the model, set materials, bones, and animations. You do not #need all of them as long as they are empty lists (they are by default)''' #ctx = rapi.rpgCreateContext() #modelType = get_type(data) #if modelType == 0: #parser = SanaeParser(data) #else: #parser = RFParser(data) #parser.parse_file() #mdl = rapi.rpgConstructModel() #mdl.setModelMaterials(NoeModelMaterials(parser.texList, parser.matList)) #mdl.setBones(parser.boneList) #mdl.setAnims(parser.animList) #mdlList.append(mdl) #return 1 class RFParser(object): '''Type MESH08 parser''' def __init__(self, data): '''Initialize some data. Refer to Sanae.py to see what is already initialized''' self.inFile = NoeBitStream(data) self.animList = [] self.texList = [] self.matList = [] self.boneList = [] def plot_points(self, numVerts): rapi.rpgCommitTriangles(None, noesis.RPGEODATA_USHORT, numVerts, noesis.RPGEO_POINTS, 1) def read_name(self, n): string = self.inFile.readBytes(n) try: return noeStrFromBytes(string) except: return "" def parse_vertices(self, numVerts): vertBuff = self.inFile.readBytes(numVerts*64) rapi.rpgBindPositionBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 64, 0) rapi.rpgBindNormalBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 64, 32) rapi.rpgBindUV1BufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 64, 44) def parse_faces(self, numIdx): return self.inFile.readBytes(numIdx*2) def parse_mesh(self, numMesh): for i in range(1): print(i, self.inFile.tell()) meshName = self.read_name(100) #print(i, meshName, self.inFile.tell()) unk = self.read_name(100) matrix1 = NoeMat44.fromBytes(self.inFile.readBytes(64)).toMat43() matrix2 = NoeMat44.fromBytes(self.inFile.readBytes(64)).toMat43() matrix3 = NoeMat44.fromBytes(self.inFile.readBytes(64)).toMat43() unk, unk2, unk3 = self.inFile.read('3H') texName = os.path.basename(self.read_name(204)) self.inFile.seek(91, 1) numVerts = self.inFile.readUShort() if numVerts: self.parse_vertices(numVerts) numIdx = self.inFile.readUShort() if numIdx: idxBuff = self.parse_faces(numIdx) rapi.rpgSetMaterial(texName) rapi.rpgCommitTriangles(idxBuff, noesis.RPGEODATA_USHORT, numIdx, noesis.RPGEO_TRIANGLE, 1) def parse_file(self): idstring = self.inFile.readBytes(6) numMesh = self.inFile.readUShort() self.parse_mesh(numMesh) class SanaeParser(object): def __init__(self, data): '''Initialize some data. Refer to Sanae.py to see what is already initialized''' self.inFile = NoeBitStream(data) self.animList = [] self.texList = [] self.matList = [] self.boneList = [] def read_name(self, n): string = self.inFile.readBytes(n) try: return noeStrFromBytes(string) except: return "" def build_mesh(self, vertList, normList, uvList, idxList, matrix1, texName): #build buffers vertBuff = bytes() normBuff = bytes() uvBuff = bytes() idxBuff = bytes() count = 0 for idx in idxList: vertBuff += bytes(struct.pack('3f', *vertList[idx])) normBuff += struct.pack('3f', *normList[idx]) uvBuff += struct.pack('2f', *uvList[count]) idxBuff += struct.pack('L', count) count += 1 rapi.rpgBindPositionBuffer(vertBuff, noesis.RPGEODATA_FLOAT, 12) rapi.rpgBindNormalBuffer(normBuff, noesis.RPGEODATA_FLOAT, 12) rapi.rpgBindUV1Buffer(uvBuff, noesis.RPGEODATA_FLOAT, 8) rapi.rpgSetTransform(matrix1) rapi.rpgSetMaterial(texName) rapi.rpgCommitTriangles(idxBuff, noesis.RPGEODATA_UINT, count, noesis.RPGEO_TRIANGLE, 1) #rapi.immBegin(noesis.RPGEO_TRIANGLE) #count = 0 #for index in idxList: #rapi.immVertex3(vertList[index]) #rapi.immNormal3(normList[index]) #rapi.immUV2(uvList[count]) #count += 1 #rapi.immEnd() #rapi.rpgSetTransform(matrix1) def parse_vertices(self, numVerts): #vertBuff = self.inFile.readBytes(numVerts*28) #rapi.rpgBindPositionBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 28, 0) #rapi.rpgBindNormalBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 28, 16) vertList = [] normList = [] for i in range(numVerts): vertList.append(self.inFile.read('3f')) self.inFile.readUInt() normList.append(self.inFile.read('3f')) return vertList, normList def parse_faces(self, numFaces): #idxBuff = bytes() #uvBuff = bytes() #for i in range(numFaces): #idxBuff += self.inFile.readBytes(12) #self.inFile.seek(36, 1) #uvBuff += self.inFile.readBytes(8) #self.inFile.readFloat() #uvBuff += self.inFile.readBytes(8) #self.inFile.readFloat() #uvBuff += self.inFile.readBytes(8) #self.inFile.readFloat() #self.inFile.readUInt() #rapi.rpgBindUV1Buffer(uvBuff, noesis.RPGEODATA_FLOAT, 8) #return idxBuff idxList = [] uvList = [] for i in range(numFaces): idxList.extend(self.inFile.read('3L')) self.inFile.seek(36, 1) uvList.append([self.inFile.readFloat(), self.inFile.readFloat() * -1]) self.inFile.readFloat() uvList.append([self.inFile.readFloat(), self.inFile.readFloat() * -1]) self.inFile.readFloat() uvList.append([self.inFile.readFloat(), self.inFile.readFloat() * -1]) self.inFile.readFloat() self.inFile.readUInt() return idxList, uvList def parse_bones(self, numBones): for i in range(numBones): self.inFile.seek(100, 1) def parse_unk(self, count): for i in range(count): self.inFile.seek(40, 1) def parse_mesh(self, numMesh): for i in range(numMesh): meshName = self.read_name(100) unk = self.read_name(100) matrix1 = NoeMat44.fromBytes(self.inFile.readBytes(64)).toMat43() matrix2 = NoeMat44.fromBytes(self.inFile.readBytes(64)).toMat43() matrix3 = NoeMat44.fromBytes(self.inFile.readBytes(64)).toMat43() numVerts, numFaces, unk1 = self.inFile.read('3H') texName = os.path.basename(self.read_name(204)) self.inFile.seek(91, 1) if numVerts: vertList, normList = self.parse_vertices(numVerts) #rapi.rpgSetTransform(matrix1) if numFaces: idxList, uvList = self.parse_faces(numFaces) #numIdx = numFaces * 3 #rapi.rpgSetMaterial(texName) #rapi.rpgCommitTriangles(idxBuff, noesis.RPGEODATA_UINT, numIdx, noesis.RPGEO_TRIANGLE, 1) self.build_mesh(vertList, normList, uvList, idxList, matrix1, texName) numBones = self.inFile.readUInt() self.parse_bones(numBones) self.parse_unk(unk1) def parse_file(self): '''Main parser method''' numMesh = self.inFile.readUShort() self.parse_mesh(numMesh) copialo dentro de un fmt_Riftonline.py si quieres llamarlo asi pero siempre que le preceda el fmt_ que fue ya aprendiste a adaptar armaduras? Link to comment Share on other sites More sharing options...
PromeTheuS Posted January 24, 2014 Author Report Share Posted January 24, 2014 jajajaja muchisisisimas gracias!!! Armaduras... estoy en ello jajaja no se aprende de un día para otro, los vídeos que estan no ayudan mucho que digamos... Link to comment Share on other sites More sharing options...
PromeTheuS Posted January 24, 2014 Author Report Share Posted January 24, 2014 olle, me pone que la linea 17 esta mal. que hago? copié esto y no funciona porque está en extención .msh el python pero el del rift online es assets.xxx "(xxx son números)" Link to comment Share on other sites More sharing options...
LuisCbr13 Posted January 24, 2014 Report Share Posted January 24, 2014 me he huebeado es para este juego Debes iniciar sesión para ver el contenido del enlace en esta publicación. Link to comment Share on other sites More sharing options...
LuisCbr13 Posted January 24, 2014 Report Share Posted January 24, 2014 estuve buscando extractor para el rift con archivos assets y solo hay el de h4x0r que es para la version 1.9 y el cliente ahora es 2.5 probe con el script y me descompile archivos sin formato y con una mierda de números XD Link to comment Share on other sites More sharing options...
PromeTheuS Posted January 25, 2014 Author Report Share Posted January 25, 2014 si te crea muchos archivos con números sin formatos que pena, tiene cosas que realmente son interesantes. Link to comment Share on other sites More sharing options...
Pantsu Posted January 30, 2014 Report Share Posted January 30, 2014 Es normal que cuando un videojuego cambia de versión suelen cambiar la programación de los paquetes para evitar plagios de sus nuevas adquisiciones. En mi opinión creo que en el cliente pudo a ver cambiado el string y el OFFSET 0x14 (Seguramente al a ver puesto otra versión hayan cambiado estas dos y muchas otras cosas dentro de los paquetes), por así decirlo habría que modificar bastantes cosas en el script de Ekey para hacerlo funcionar. ¿Puedes subir un paquete cualquiera del RIFT para revisarlo? Si es posible también ponerme el enlace de descarga del cliente (Actual) También puedes enviarle un mensaje privado a Ekey (H4XOR) que tendrá mas experiencia que yo en el tema de los Scripts de QuickBMS (Tiene muchísima mas experiencia, me enseño de todo un poco, es una gran persona) seguramente te ayude, es muy simpático. P.D. Te dejo su Skype aunque no creo que agregue e desconocidos, ami tardo bastante en aceptarme, igualmente te lo dejo: ekey_054 Link to comment Share on other sites More sharing options...
Recommended Posts