Jump to content
Sluicer

Noesis script for ghg files

Recommended Posts

Sluicer

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:

kSuAzcw.png

I have updated the script, so that materials will also be respected now. You can get models like in the following posts.

Share this post


Link to post
Share on other sites
dsdude123

If I were to export the model to an OBJ in noesis, can I apply textures in the same way as your other tool?

Share this post


Link to post
Share on other sites
Sluicer

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:

xl2qXrr.png        4W4XQLh.png

I have updated the script in the first post!

 

 

Edited by Sluicer

Share this post


Link to post
Share on other sites
dsdude123

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.

Share this post


Link to post
Share on other sites
Sluicer

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 by Sluicer
Skript update

Share this post


Link to post
Share on other sites
Cristian

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

Share this post


Link to post
Share on other sites
Sluicer

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.

Share this post


Link to post
Share on other sites
Cristian

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

 

Share this post


Link to post
Share on other sites
Sluicer

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?

Share this post


Link to post
Share on other sites
Seven

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.

Share this post


Link to post
Share on other sites
Mysteli
2 minutes ago, Seven said:

If you guys are interested let me know,

No need to ask. Of course we are! :P

Share this post


Link to post
Share on other sites
Seven
1 minute ago, Xiron said:

No need to ask. Of course we are! :P

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?

Share this post


Link to post
Share on other sites
Mysteli

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.

Share this post


Link to post
Share on other sites
Seven
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.

Share this post


Link to post
Share on other sites
Seven

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.

Share this post


Link to post
Share on other sites
Seven

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?

Share this post


Link to post
Share on other sites
EdmJackOLantern

How can i get this? i want to edit the models of lego star wars but idk how to open the ghg files :/

Share this post


Link to post
Share on other sites
Mysteli

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.

 

Share this post


Link to post
Share on other sites
Pim19

Hi great, Does this work for LEGO Star Wars The Force Awakens?

 

I need some help for that, Starting a project

 

 

Share this post


Link to post
Share on other sites
Spergalicious
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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.