Sluicer Posted August 23, 2015 Share Posted August 23, 2015 I once started to work on a skript for noesis that can open ghg files from the game LEGO Star Wars The Complete Saga. I mentioned it in a comment in a blog and decided to create a new topic for it. By this, I hope that it will be easier to find for people, that did not read the blog. There are a lot of comments because it is in development / research state. So here is the unfinished script: from inc_noesis import * import noesis import rapi def registerNoesisTypes(): '''Register the plugin. Just change the Game name and extension.''' handle = noesis.register("LEGO TTGames Mesh (*pc.ghg)", ".ghg") noesis.setHandlerTypeCheck(handle, noepyCheckType) noesis.setHandlerLoadModel(handle, noepyLoadModel) return 1 def noepyCheckType(data): '''Verify that the format is supported by this plugin. Default yes''' bs = NoeBitStream(data) tmp = bs.readInt() if tmp == 0x3032554e: # NU20 #Batman return 1 bs.seek(tmp, NOESEEK_REL) tmp = bs.readInt() if tmp == 0x3032554e: # NU20 #Star Wars return 1 return 0 def noepyLoadModel(data, mdlList): bs = NoeBitStream(data) ctx = rapi.rpgCreateContext() stack = [] textures = [] materials = [] NU20 = bs.readInt() if NU20 == 0x3032554e: # NU20 #Batman print("NU20 first") else: print("NU20 @ 0x%x" % NU20) numberImg = bs.readShort() print("numberImg %d" % numberImg) bs.seek(NU20+4, NOESEEK_ABS) bs.seek(0x4, NOESEEK_REL) bs.seek(0xc, NOESEEK_REL) #HEAD fourCC = bs.readInt() chunkSize = bs.readInt() absOffsetPNTR = bs.tell() + bs.readInt() offsetGSNH = bs.readInt() absOffsetGSNH = bs.tell() + offsetGSNH #NTBL fourCC = bs.readInt() chunkSize = bs.readInt() bs.seek(chunkSize-8, NOESEEK_REL) fourCC = bs.readInt() if (fourCC == 1178948180): # TREF chunkSize = bs.readInt() bs.seek(chunkSize-8, NOESEEK_REL) fourCC = bs.readInt() if (fourCC == 810832724): # TST0 chunkSize = bs.readInt() bs.seek(chunkSize-8, NOESEEK_REL) fourCC = bs.readInt() #MS00 - Materials print("MS00 @ 0x%x" % (bs.tell()-4)) #fourCC = bs.readInt() chunkSize = bs.readInt() numberMaterials = bs.readInt() bs.seek(4, NOESEEK_REL) # 0 for i in range (0, numberMaterials): material = NoeMaterial("mat%03i"%i, "") #create a material bs.seek(0x38, NOESEEK_REL) # matId = bs.readInt() bs.seek(0x18, NOESEEK_REL) # material.setDiffuseColor(NoeVec4([bs.readFloat(), bs.readFloat(), bs.readFloat(), bs.readFloat()])) bs.seek(0x10, NOESEEK_REL) # texId = bs.readShort() if (texId != -1): material.setTexture("tex%03i"%texId) bs.seek(0x52, NOESEEK_REL) # colorRbga = bs.readBytes(4) # material.setDiffuseColor(NoeVec4([colorRbga[0]/255, colorRbga[1]/255, colorRbga[2]/255, colorRbga[3]/255])) bs.seek(0x1F8, NOESEEK_REL) # materials.append(material) bs.seek(absOffsetGSNH - 12, NOESEEK_ABS) #GSNH print("GSNH @ 0x%x" % bs.tell()) fourCC = bs.readInt() chunkSize = bs.readInt() bs.readInt() numberImages = bs.readInt() print("NumberImages %d" % numberImages) absOffsetImagesMeta = bs.tell() + bs.readInt() bs.seek(0x28, NOESEEK_REL) absOffsetMeshMeta = bs.readInt() - 4 + bs.tell() bs.seek(0x130, NOESEEK_REL) numberBones = bs.readInt() absOffsetBones = bs.readInt() - 4 + bs.tell() print("NumberBones %d" % numberBones) absOffsetBones2 = bs.readInt() - 4 + bs.tell() absOffsetBones3 = bs.readInt() - 4 + bs.tell() bs.seek(24, NOESEEK_REL) numberLayer = bs.readInt() absOffsetLayer = bs.readInt() - 4 + bs.tell() print("NumberLayer %d" % numberLayer) # goto image meta bs.seek(absOffsetImagesMeta, NOESEEK_ABS) size = 0 if NU20 == 0x3032554e: #Batman imageMetas = [] for i in range (0, numberImages): tmp = bs.readInt() stack.append(bs.tell()) bs.seek(tmp-4, NOESEEK_REL) width = bs.readInt() height = bs.readInt() bs.seek(0x10, NOESEEK_REL) bs.seek(0x2c, NOESEEK_REL) size = bs.readInt() print("Image{0}: width = {1:4d}; height = {2:4d}; size = {3:8d}".format(i, width, height, size)) imageMetas.append(ImageMeta(width, height, size)) bs.seek(stack.pop(), NOESEEK_ABS) bs.seek(absOffsetPNTR-8, NOESEEK_ABS) # goto PNTR #print("1 0x%x" % bs.tell()) fourCC = bs.readInt() #print("2 0x%x" % bs.tell()) chunkSize = bs.readInt() print("3 0x%x" % bs.tell()) bs.seek(chunkSize-4, NOESEEK_REL) # goto EndOfPNTR print("4 0x%x" % bs.tell()) for i in range (0, numberImages): data = bs.readBytes(imageMetas[i].size) texture = rapi.loadTexByHandler(data, ".dds") #NoeTexture(str(i), width, height, data, texFmt) texture.name = "tex%03i"%i textures.append(texture) #bs.seek(size, NOESEEK_REL) print("5 0x%x" % bs.tell()) else: numberRealImages = 0 for i in range (0, numberImages): tmp = bs.readInt() stack.append(bs.tell()) bs.seek(tmp-4, NOESEEK_REL) width = bs.readInt() height = bs.readInt() print("Image{0}: width = {1:4d}; height = {2:4d}".format(i, width, height)) if width != 0 and height != 0: numberRealImages += 1 bs.seek(stack.pop(), NOESEEK_ABS) bs.seek(6, NOESEEK_ABS) #goto beginOfFile + 6 for i in range (0, numberRealImages): pos = bs.tell() width = bs.readInt() height = bs.readInt() bs.readInt() bs.readInt() bs.readInt() size = bs.readInt() print("Image{0} @ {1:8x}: width = {2:4d}; height = {3:4d}".format(i, pos, width, height)) data = bs.readBytes(size) texture = rapi.loadTexByHandler(data, ".dds") #NoeTexture(str(i), width, height, data, texFmt) texture.name = "tex%03i"%i textures.append(texture) # bs.seek(size, NOESEEK_REL) #End DDS vertexLists = [] numberVertexLists = bs.readShort() for i in range (0, numberVertexLists): size = bs.readInt() vertexLists.append(bs.readBytes(size)) indexLists = [] numberIndices = bs.readShort() for i in range (0, numberIndices): size = bs.readInt() indexLists.append(bs.readBytes(size)) bs.seek(absOffsetMeshMeta, NOESEEK_ABS) bs.seek(0x14, NOESEEK_REL) numberParts = bs.readInt() print("NumberParts %d" % numberParts) bs.seek(0x08, NOESEEK_REL) partPos = bs.tell() bytesForPositions = [] stride = [] bytesForIndexBuffer = [] numIdx = [] for i in range (0, numberParts): offsetPart = bs.readInt() bs.seek(offsetPart - 4, NOESEEK_REL) bs.readInt() // 6 numberIndices = bs.readInt()+2 sizeVertex = bs.readShort() bs.seek(0x0a, NOESEEK_REL) offsetVertex = bs.readInt() numberVertex = bs.readInt() offsetIndices = bs.readInt() indexList = bs.readInt() vertexList = bs.readInt() bytesForPositions.append(vertexLists[vertexList][offsetVertex*sizeVertex:offsetVertex*sizeVertex+numberVertex*sizeVertex]) stride.append(sizeVertex) bytesForIndexBuffer.append(indexLists[indexList][offsetIndices*2:offsetIndices*2+numberIndices*2]) numIdx.append(numberIndices) partPos += 4 bs.seek(partPos, NOESEEK_ABS) bs.seek(absOffsetLayer, NOESEEK_ABS) layers = [] for i in range (0, numberLayer): layer = Layer(i) absOffsetText = bs.readInt() - 4 + bs.tell() tmp = bs.readInt() if (tmp != 0): layer.p1 = bs.tell() + tmp - 4 tmp = bs.readInt() if (tmp != 0): layer.p2 = bs.tell() + tmp - 4 tmp = bs.readInt() if (tmp != 0): layer.p3 = bs.tell() + tmp - 4 tmp = bs.readInt() if (tmp != 0): layer.p4 = bs.tell() + tmp - 4 layers.append(layer) for layer in (layers): if (layer.p1 != 0): bs.seek(layer.p1, NOESEEK_ABS) for j in range (0, numberBones): #parts = 0 tmp = bs.readInt() if (tmp != 0): stack.append(bs.tell()) bs.seek(tmp-4, NOESEEK_REL) bs.seek(8, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix bs.seek(0xB0, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts parts = bs.readInt() bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials partMaterials = [] for p in range (0, parts): partMaterials.append(bs.readInt()) partMaterials = list(reversed(partMaterials)) bs.seek(stack.pop(), NOESEEK_ABS) bonePartPair = BonePartPair(0, j, parts, partMaterials) layer.bonePartPairs.append(bonePartPair) if (layer.p2 != 0): bs.seek(layer.p2, NOESEEK_ABS) bs.seek(8, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix bs.seek(0xB0, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts parts = bs.readInt() bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials partMaterials = [] for p in range (0, parts): partMaterials.append(bs.readInt()) partMaterials = list(reversed(partMaterials)) #bs.seek(stack.pop(), NOESEEK_ABS) bonePartPair = BonePartPair(1, -1, parts, partMaterials) layer.bonePartPairs.append(bonePartPair) if (layer.p3 != 0): bs.seek(layer.p3, NOESEEK_ABS) for j in range (0, numberBones): #parts = 0 tmp = bs.readInt() if (tmp != 0): stack.append(bs.tell()) bs.seek(tmp-4, NOESEEK_REL) bs.seek(8, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix bs.seek(0xB0, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts parts = bs.readInt() bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials partMaterials = [] for p in range (0, parts): partMaterials.append(bs.readInt()) partMaterials = list(reversed(partMaterials)) bs.seek(stack.pop(), NOESEEK_ABS) bonePartPair = BonePartPair(2, j, parts, partMaterials) layer.bonePartPairs.append(bonePartPair) if (layer.p4 != 0): bs.seek(layer.p4, NOESEEK_ABS) bs.seek(8, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix bs.seek(0xB0, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts parts = bs.readInt() bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials partMaterials = [] for p in range (0, parts): partMaterials.append(bs.readInt()) partMaterials = list(reversed(partMaterials)) #bs.seek(stack.pop(), NOESEEK_ABS) bonePartPair = BonePartPair(3, -1, parts, partMaterials) layer.bonePartPairs.append(bonePartPair) bs.seek(absOffsetBones, NOESEEK_ABS) bones = [] bones0 = [] bones1 = [] bones2 = [] boneNames = [] bonePIndices = [] globalCounter = 0 for i in range (0, numberBones): boneMat = NoeMat44.fromBytes(bs.readBytes(0x40)).toMat43() bs.seek(0xc, NOESEEK_REL) boneIndex = i offsetText = bs.readInt() stack.append(bs.tell()) bs.seek(offsetText - 4, NOESEEK_REL) boneName = bs.readString() boneNames.append(boneName) bs.seek(stack.pop(), NOESEEK_ABS) bonePIndex = bs.readByte() bonePIndices.append(bonePIndex) bs.readByte() bs.readByte() bs.readByte() bs.readInt() bs.readInt() bs.readInt() print(boneName + ": " + repr(i) + "-->" + repr(bonePIndex)) bones0.append(boneMat) for i in range (0, numberBones): boneMat = NoeMat44.fromBytes(bs.readBytes(0x40)).toMat43() #print(boneMat) if (bonePIndices[i] != -1): boneMat = boneMat.__mul__(bones1[bonePIndices[i]]) bone = NoeBone(i, boneNames[i], boneMat, None, bonePIndices[i]) bones.append(bone) bones1.append(boneMat) for i in range (0, numberBones): boneMat = NoeMat44.fromBytes(bs.readBytes(0x40)).toMat43() #print(boneMat) bones2.append(boneMat) globalCounter = 0 for layer in (layers): print("Layer: %d" % layer.layer) if layer.bonePartPairs: for bonePartPair in (layer.bonePartPairs): print(" Pointer: " + repr(bonePartPair.pointer) + " Bone: " + repr(bonePartPair.bone) + " Parts: " + repr(bonePartPair.parts)) if (bonePartPair.bone != -1): rapi.rpgSetTransform(bones1[bonePartPair.bone]) else: rapi.rpgSetTransform(None) print(bonePartPair.partMaterials) for j in range (0, bonePartPair.parts): rapi.rpgBindPositionBuffer(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 0) if (stride[globalCounter] == 44): rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 28) #rapi.rpgBindBoneIndexBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 40, 4) #rapi.rpgBindBoneWeightBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 36, 4) if (stride[globalCounter] == 40): rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 24) #rapi.rpgBindBoneIndexBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 36, 4) #rapi.rpgBindBoneWeightBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 32, 4) if (stride[globalCounter] == 36): if NU20 == 0x3032554e: #Batman rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 20) else: rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 28) if (stride[globalCounter] == 32): rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 24) if (stride[globalCounter] == 28): if NU20 == 0x3032554e: #Batman rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 20) rapi.rpgSetMaterial("mat%03i"%bonePartPair.partMaterials[j]) rapi.rpgCommitTriangles(bytesForIndexBuffer[globalCounter], noesis.RPGEODATA_SHORT, numIdx[globalCounter], noesis.RPGEO_TRIANGLE_STRIP, 1) globalCounter = globalCounter + 1 rapi.rpgClearBufferBinds() mdl = rapi.rpgConstructModel() mdl.setModelMaterials(NoeModelMaterials(textures, materials)) mdl.setBones(bones) mdlList.append(mdl) #important, don't forget to put your loaded model in the mdlList return 1 class Layer(object): def __init__(self, layer): self.layer = layer self.bonePartPairs = [] self.p1 = 0 self.p2 = 0 self.p3 = 0 self.p4 = 0 class BonePartPair(object): def __init__(self, pointer, bone, parts, partMaterials): self.pointer = pointer self.bone = bone self.parts = parts self.partMaterials = partMaterials class ImageMeta(object): def __init__(self, width, height, size): self.width = width self.height = height self.size = size You can create results like this with the script: I have updated the script, so that materials will also be respected now. You can get models like in the following posts. McJobless, dsdude123, ProfessorBrickkeeper and 3 others 6 Link to comment Share on other sites More sharing options...
zerf Posted August 23, 2015 Share Posted August 23, 2015 Fantastic! Link to comment Share on other sites More sharing options...
dsdude123 Posted August 25, 2015 Share Posted August 25, 2015 If I were to export the model to an OBJ in noesis, can I apply textures in the same way as your other tool? Link to comment Share on other sites More sharing options...
Sluicer Posted August 26, 2015 Author Share Posted August 26, 2015 (edited) I am working on an update. Then it should be possible to export also the textures. But I do not know how noesis will react: Â Â Â Â Â Â Â I have updated the script in the first post! Â Â Edited August 28, 2015 by Sluicer dsdude123 1 Link to comment Share on other sites More sharing options...
dsdude123 Posted September 2, 2015 Share Posted September 2, 2015 will it work on Lego batman? Please read. I once started to work on a skript for noesis that can open ghg files from the game LEGO Star Wars The Complete Saga. Link to comment Share on other sites More sharing options...
Sluicer Posted September 2, 2015 Author Share Posted September 2, 2015 (edited) The file formats of the games are similar. But not exactly the same. E.g. are the images in the files one time at the beginning of the files and the other time at the end of the files. That is the reason why I asked if NU20 == 0x3032554e: # NU20 The script is prepared to read also the files from the batman game, but there is currently no support for material and textures (due to additional chunks). The vertex lists might also differ for some files, but I have to crosscheck that. I do not remember exactly and the scripts are far of beeing finished. I was able to open some of the batman files and I am working on the materials currently. ---- I updated the script, so that it can handle many of the Batman files too. I will post some samples in the Batman thread. Edited September 3, 2015 by Sluicer Skript update dsdude123 1 Link to comment Share on other sites More sharing options...
Cristian Posted December 4, 2015 Share Posted December 4, 2015 Hello Sluicer I have tried this script as long as I tried the Extractpcghg that you have released on a GHG from Lego Dimensions without any success I got this error by the script : ---------------------------Noesis Python Error---------------------------Traceback (most recent call last): File "C:\3d\noesis\plugins\python\ttgames.py", line 20, in noepyCheckType   bs.seek(tmp, NOESEEK_REL) File "C:\3d\noesis\plugins\python\inc_noesis.py", line 164, in seek   self.toUnpacker(); r = noeSuper(self).seek(addr, isRelative); self.fromUnpacker(); return r File "C:\3d\noesis\plugins\python\inc_noesis.py", line 160, in fromUnpacker   self.setOffset(self.byteOfs) File "C:\3d\noesis\plugins\python\inc_noesis.py", line 77, in setOffset   noesis.bsSetOfs(self.h, ofs)RuntimeError: Tried to set offset beyond buffer size. (1627586564 > 90773) --------------------------- I suppose this is a new GHG format Link to comment Share on other sites More sharing options...
Sluicer Posted December 5, 2015 Author Share Posted December 5, 2015 This script is only for LEGO Star Wars The Complete Saga and the first Batman game. The ExtractPcGhg Tool is only for *pc.ghg files. The ExtractNxgMesh Tool is for *nxg.gsc and *nxg.ghg files. The ExtractDx11Mesh Tool is for *dx11.gsc and *dx11.ghg files. All tools do not cover everything. So you have to inform me, when you detect a file that is not working. I already experimented with lego worlds a bit, but I have no access to Lego Dimensions. Link to comment Share on other sites More sharing options...
Cristian Posted December 5, 2015 Share Posted December 5, 2015 This script is only for LEGO Star Wars The Complete Saga and the first Batman game. The ExtractPcGhg Tool is only for *pc.ghg files. The ExtractNxgMesh Tool is for *nxg.gsc and *.nxg.ghg files. The ExtractDx11Mesh Tool is for *dx11.gsc and *dx11.ghg files. All tools do not cover everything. So you have to inform me, when you detect a files that is not working. I already experimented with lego worlds a bit, but I have no access to Lego Dimensions. that's clearer now.. I have tried the latest ExtractNxgMesh with Lego Dimensions NXG.GHG without success : index out of bound in ExtractNxgMESH.ExtractNxgMESH.readTXGH()  in ExtractNxgMESH.ExtractNxgMESH.Extract()  in ExtractNxgMESH.Program.Main(String[] args)) while the script for noesis work with a PC.ghg file from Lego Indiana Jones 2 (just to let you know) I would like to help you if you need to working on Dimensions File thank you  Link to comment Share on other sites More sharing options...
Sluicer Posted December 6, 2015 Author Share Posted December 6, 2015 I can only work on the files, if I have access to them. But I do not own the game and currently I have no intension in buying it. Do you have the possibility to share one or two files? Link to comment Share on other sites More sharing options...
Sluicer Posted January 4, 2016 Author Share Posted January 4, 2016 (edited) Here is a new version of the tool:http://oresome.rockraidersunited.com/download/305 It now could also handle many files from the games dimensions and worlds. I hope it works. Edited January 4, 2016 by Sluicer molnarnoah 1 Link to comment Share on other sites More sharing options...
Seven Posted July 18, 2016 Share Posted July 18, 2016 Hello, I just found these forums a few days ago, and I'm very interested in creating many new skins and hopefully models for the game. I've loved these games since the first one came out, and after seeing all the improved character models in Lego TFA, I thought it could be cool to try and use some of those to improve the Complete Saga. I have a fair amount of experience with modding, as I've been working on things for Star Wars Jedi Academy since this past December. If you guys are interested let me know, because I still have some questions for compiling all the data and getting it in game. Link to comment Share on other sites More sharing options...
Fluffy Cupcake Posted July 18, 2016 Share Posted July 18, 2016 2 minutes ago, Seven said: If you guys are interested let me know, No need to ask. Of course we are! Seven 1 Link to comment Share on other sites More sharing options...
Seven Posted July 18, 2016 Share Posted July 18, 2016 1 minute ago, Xiron said: No need to ask. Of course we are! Awesome, so I have a few questions. First, does all of the game data need to be stored in specifically named .dat files (game.dat, episode1.dat) or can it be separate with any random name? Link to comment Share on other sites More sharing options...
Fluffy Cupcake Posted July 18, 2016 Share Posted July 18, 2016 I think TCS is capable of running with extracted files, I don't know if a recompiler even exists for TT LEGO games 'cause it was never really needed. Link to comment Share on other sites More sharing options...
Seven Posted July 18, 2016 Share Posted July 18, 2016 1 minute ago, Xiron said: I think TCS is capable of running with extracted files, I don't know if a recompiler even exists for TT LEGO games 'cause it was never really needed. Hmm, alright, well I'm going to need to sleep soon, so I'll get back to you tomorrow for more on the project. Link to comment Share on other sites More sharing options...
Fluffy Cupcake Posted July 18, 2016 Share Posted July 18, 2016 Alright, toodles! Link to comment Share on other sites More sharing options...
Seven Posted July 19, 2016 Share Posted July 19, 2016 I've again found myself at too late of an hour to really do anything, so for now if anyone could send me an example of a working modded file and what to do with it that'd be appreciated. I want to see what a working mod looks like as something of a template. Link to comment Share on other sites More sharing options...
Seven Posted July 20, 2016 Share Posted July 20, 2016 I was able to get a mod to work in game for the customizable character, but for the normal characters do I have to recompress the ghg files after extracting and editing? Link to comment Share on other sites More sharing options...
EdmJackOLantern Posted September 5, 2016 Share Posted September 5, 2016 How can i get this? i want to edit the models of lego star wars but idk how to open the ghg files Link to comment Share on other sites More sharing options...
Fluffy Cupcake Posted September 5, 2016 Share Posted September 5, 2016 That is the file. I'm not sure the full details, but the gist of it is that you copy & paste the {code} contents in OP in a text editor and save the file with a .py extension and put the file in Noesis' plugins folder. Â Link to comment Share on other sites More sharing options...
Pim19 Posted October 14, 2016 Share Posted October 14, 2016 Hi great, Does this work for LEGO Star Wars The Force Awakens?  I need some help for that, Starting a project   Link to comment Share on other sites More sharing options...
Spergalicious Posted October 17, 2016 Share Posted October 17, 2016 On 1/4/2016 at 10:39 AM, Sluicer said: Here is a new version of the tool:http://oresome.rockraidersunited.com/download/305 It now could also handle many files from the games dimensions and worlds. I hope it works. Â Hey there, first time poster. I'm probably overlooking something really obvious here, but I can't seem to get this to work with Noesis. I haven't had any issues with it running the other plugins I've installed, but it doesn't want to recognize this one. I got the one in the OP to work fine, but it won't read the files from Lego LOTR like I'm trying to do. Link to comment Share on other sites More sharing options...
Sluicer Posted October 17, 2016 Author Share Posted October 17, 2016 On 5.12.2015 at 1:38 AM, Sluicer said: This script is only for LEGO Star Wars The Complete Saga and the first Batman game. The ExtractPcGhg Tool is only for *pc.ghg files. The ExtractNxgMesh Tool is for *nxg.gsc and *nxg.ghg files. The ExtractDx11Mesh Tool is for *dx11.gsc and *dx11.ghg files. All tools do not cover everything. So you have to inform me, when you detect a file that is not working. I already experimented with lego worlds a bit, but I have no access to Lego Dimensions. There is the script to work with Noesis and only with the games Star Wars The Complete Saga and the first Batman. There are stand alone tools, that can extract mesh information from different games (depending on the file extentions) into obj files. Spergalicious and Zorg_Sinister 2 Link to comment Share on other sites More sharing options...
Spergalicious Posted October 17, 2016 Share Posted October 17, 2016 Ah, thank you for clarifying that! It wasn't very clear before. Link to comment Share on other sites More sharing options...
Recommended Posts