Friday at 01:30 AM3 days Hi, is anyone able to extract the UFC 3, 4, 5, Octagon or even the arenas 3D model? Been seeing many 3D models of the fighters extracted but no discussion of the octagon or arena. Thanks.
Friday at 12:32 PM3 days Upload files or something, without clay you can't make bricks... otherwise they'll close this thread and you'll be left without the square or octagon or arena...Thanks.
Saturday at 12:00 AM2 days Author Here's the UFC 3 (would like the higher games but I am not sure how to unpack those) Stage folder I tried to unpack, but to no success. I'm not sure if this is the folder with the Arena or octagon, but if this isn't it I have the other files. stage.7z
Saturday at 07:55 AM2 days Supporter I think i got it. Now it should unpack compressed textures.############################## get BaseFileName basename get FileExtension extension get FileSize asize endian big get ResourceCount uint32 getdstring Dummy 0x8 get TOCOffset uint32 goto TOCOffset for i = 0 < ResourceCount getdstring ResourceName 0x10 getdstring ResourceType 0x4 get ResourceSize uint32 get ResourceOffset uint32 getdstring Dummy 0x4 savepos cPos if ResourceType == "tex" goto ResourceOffset savepos ResourceBaseOffset get TexResourceCount uint32 getdstring Dummy 0x8 get TexTOCOffset uint32 for j = 0 < TexResourceCount getdstring ResourceName 0x10 getdstring ResourceType 0x4 get TexResourceSize uint32 get TexResourceOffset uint32 getdstring Dummy 0x4 savepos EndOfInfo math TexResourceOffset + ResourceBaseOffset math TexResourceSize - 16 goto TexResourceOffset getdstring Dummy 0x4 endian little get DecompressedSize uint32 getdstring Dummy 0x8 savepos Offset endian big goto EndOfInfo string Name p "%s/%s.%s" BaseFileName ResourceName ResourceType clog Name Offset TexResourceSize DecompressedSize next j goto cPos else string Name p "%s/%s.%s" BaseFileName ResourceName ResourceType log Name ResourceOffset ResourceSize endif next i Got something.So mesh format is something like this. I will try to write noesis script.//------------------------------------------------ //--- 010 Editor v14.0 Binary Template // // File: // Authors: // Version: // Purpose: // Category: // File Mask: // ID Bytes: // History: //------------------------------------------------ BigEndian();OutputPaneClear(); local uint32 i,j,k,l; char Sign[4]; uint32 Unknown_0; uint32 Unknown_1; uint32 Unknown_2; uint32 Unknown_3; uint32 Unknown_4; uint32 ShapeCount; uint32 ShapeDefOffset; // + 8 uint32 TransformCount; uint32 UnknownDef0Count; uint32 TransformDefOffset; // + 8 uint32 UnknownDef0Offset; // + 8 uint32 UnknownDef1Offset; // + 8 uint32 UnknownDef1Count; uint32 Unknown_5; uint32 Unknown_6; uint32 Unknown_7; uint32 Unknown_8; uint32 TextureCount; uint32 TextureDefOffset; // + 8 FSeek(ShapeDefOffset + 8); struct { uint32 ElementCount; uint32 Unknown_0; uint32 Unknown_1; uint32 TransformIndex; byte FF[76]; uint32 Unknown_2; uint32 Unknown_3; uint32 Unknown_4; uint32 ElementBufferOffset; // + 8 // Vertices / Normals / Colors // Stride 28 uint32 Unknown0BufferOffset; // + 8 uint32 UnitVectorBufferOffset; // + 8 // Unit Vectors // Stride 16 // 2 UV Sets // Local / World uint32 Unknown1BufferOffset; // + 8 uint32 TextureIndex; char Type[16]; uint32 Unknown_6; uint32 Unknown_7; uint32 MaterialDefCount; uint32 MaterialDefOffset; // + 8 uint32 IndexBufferOffset; // + 8 uint32 ElementCount_t; uint32 Unknown_8; float BBoxX,BBoxY,BBoxZ,Radius; }ShapeDefinition[ShapeCount]<optimize=false>; FSeek(TransformDefOffset + 8); struct { char MeshName[16]; float Matrix4x4[16]; }TransformDefinition[TransformCount]; FSeek(UnknownDef0Offset + 8); struct { char Name[16]; }Unknown0Definition[UnknownDef0Count]; FSeek(UnknownDef1Offset + 8); struct { char Name[16]; uint32 Unknown_0; uint32 Unknown_1; uint32 Unknown_2; uint32 Unknown_3; }Unknown1Definition[UnknownDef1Count]; FSeek(TextureDefOffset + 8); struct { char TextureName[16]; }TextureDefinition[TextureCount];Some progress....Noesis script. If anything went wrong just let me know. Some textures are missing from scene, maybe in another file.# Script by h3x3r from inc_noesis import * import noesis import rapi import os def registerNoesisTypes(): handle = noesis.register("UFC 3 - Mesh", ".ymx") noesis.setHandlerTypeCheck(handle, noepyCheckType) noesis.setHandlerLoadModel(handle, noepyLoadModel) noesis.logPopup() return 1 def noepyCheckType(data): bs = NoeBitStream(data, NOE_BIGENDIAN) if len(data) < 20: return 0 if bs.readUInt() != 0x4A424F59: return 0 return 1 def noepyLoadModel(data, mdlList): bs = NoeBitStream(data, NOE_BIGENDIAN) baseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName())) ctx = rapi.rpgCreateContext() rapi.rpgSetOption(noesis.RPGOPT_BIGENDIAN, 1) Underline = "_" Dummy = "dummy" TextureNameList = [] MeshNameList = [] TransformList = [] # Base Info bs.read(24) ShapeCount = bs.readUInt() ShapeDefOffset = bs.readUInt() + 8 TransformCount = bs.readUInt() bs.read(4) TransformDefOffset = bs.readUInt() + 8 bs.read(28) TextureCount = bs.readUInt() TextureDefOffset = bs.readUInt() + 8 # Texture Definition bs.seek(TextureDefOffset, NOESEEK_ABS) for i in range(0, TextureCount): CurPos = bs.tell() CharCheck = bs.readUByte() if CharCheck < 128: bs.seek(CurPos) TextureNameList.append(bs.readString()) bs.seek(CurPos) bs.read(16) # Transform Definition bs.seek(TransformDefOffset, NOESEEK_ABS) for i in range(0, TransformCount): CurPos = bs.tell() MeshNameList.append(bs.readString()) bs.seek(CurPos) bs.read(16) TransformBytes = bs.read(64) TransformList.append(TransformBytes) # Shape Definition bs.seek(ShapeDefOffset, NOESEEK_ABS) for j in range(0, ShapeCount): ShapeNum = "{:04d}".format(j) ElementCount = bs.readUInt() bs.read(8) TransformIndex = bs.readUInt() - 1 bs.read(88) ElementBufferOffset = bs.readUInt() + 8 bs.read(4) UnitVectorBufferOffset = bs.readUInt() + 8 UnknownBufferOffset = bs.readUInt() + 8 UVStride = ((UnknownBufferOffset - UnitVectorBufferOffset) // ElementCount) TextureIndex = bs.readUInt() bs.read(32) IndexBufferOffset = bs.readUInt() + 8 bs.read(4) UVFlag = bs.readUInt() bs.read(16) EndOfInfo = bs.tell() bs.seek(ElementBufferOffset, NOESEEK_ABS) bs.read(4) ElementBuffer = bs.read(ElementCount * 28) bs.seek(UnitVectorBufferOffset, NOESEEK_ABS) if UVStride == 16: UnitVectorBuffer = bs.read(ElementCount * 16) else: UnitVectorBuffer = bs.read(ElementCount * 8) bs.seek(IndexBufferOffset, NOESEEK_ABS) bs.read(8) IndexCountOffset = bs.readUInt() bs.seek(IndexCountOffset, NOESEEK_ABS) IndexCount = bs.readUInt() bs.read(4) IndexBuffer = bs.read(IndexCount * 2) rapi.rpgBindPositionBufferOfs(ElementBuffer, noesis.RPGEODATA_FLOAT, 28, 0) rapi.rpgBindNormalBufferOfs(ElementBuffer, noesis.RPGEODATA_FLOAT, 28, 12) if UVStride == 16: rapi.rpgBindUV1BufferOfs(UnitVectorBuffer, noesis.RPGEODATA_FLOAT, 16, 0) #rapi.rpgBindUV2BufferOfs(UnitVectorBuffer, noesis.RPGEODATA_FLOAT, 16, 8) else: rapi.rpgBindUV1BufferOfs(UnitVectorBuffer, noesis.RPGEODATA_FLOAT, 8, 0) rapi.rpgSetName(baseName + Underline + MeshNameList[TransformIndex] + Underline + ShapeNum) if TextureIndex == TextureCount - 1: rapi.rpgSetMaterial(Dummy) else: rapi.rpgSetMaterial(TextureNameList[TextureIndex]) rapi.rpgCommitTriangles(IndexBuffer, noesis.RPGEODATA_USHORT, IndexCount, noesis.RPGEO_TRIANGLE_STRIP) bs.seek(EndOfInfo, NOESEEK_ABS) mdl = rapi.rpgConstructModel() mdlList.append(mdl) return 1 Edited 20 hours ago20 hr by h3x3r
Yesterday at 01:51 AM1 day Author 17 hours ago, h3x3r said:I think i got it. Now it should unpack compressed textures.############################## get BaseFileName basename get FileExtension extension get FileSize asize endian big get ResourceCount uint32 getdstring Dummy 0x8 get TOCOffset uint32 goto TOCOffset for i = 0 < ResourceCount getdstring ResourceName 0x10 getdstring ResourceType 0x4 get ResourceSize uint32 get ResourceOffset uint32 getdstring Dummy 0x4 savepos cPos if ResourceType == "tex" goto ResourceOffset savepos ResourceBaseOffset get TexResourceCount uint32 getdstring Dummy 0x8 get TexTOCOffset uint32 for j = 0 < TexResourceCount getdstring ResourceName 0x10 getdstring ResourceType 0x4 get TexResourceSize uint32 get TexResourceOffset uint32 getdstring Dummy 0x4 savepos EndOfInfo math TexResourceOffset + ResourceBaseOffset math TexResourceSize - 16 goto TexResourceOffset getdstring Dummy 0x4 endian little get DecompressedSize uint32 getdstring Dummy 0x8 savepos Offset endian big goto EndOfInfo string Name p "%s/%s.%s" BaseFileName ResourceName ResourceType clog Name Offset TexResourceSize DecompressedSize next j goto cPos else string Name p "%s/%s.%s" BaseFileName ResourceName ResourceType log Name ResourceOffset ResourceSize endif next i Got something.So mesh format is something like this. I will try to write noesis script.//------------------------------------------------ //--- 010 Editor v14.0 Binary Template // // File: // Authors: // Version: // Purpose: // Category: // File Mask: // ID Bytes: // History: //------------------------------------------------ BigEndian();OutputPaneClear(); local uint32 i,j,k,l; char Sign[4]; uint32 Unknown_0; uint32 Unknown_1; uint32 Unknown_2; uint32 Unknown_3; uint32 Unknown_4; uint32 ShapeCount; uint32 ShapeDefOffset; // + 8 uint32 TransformCount; uint32 UnknownDef0Count; uint32 TransformDefOffset; // + 8 uint32 UnknownDef0Offset; // + 8 uint32 UnknownDef1Offset; // + 8 uint32 UnknownDef1Count; uint32 Unknown_5; uint32 Unknown_6; uint32 Unknown_7; uint32 Unknown_8; uint32 TextureCount; uint32 TextureDefOffset; // + 8 FSeek(ShapeDefOffset + 8); struct { uint32 ElementCount; uint32 Unknown_0; uint32 Unknown_1; uint32 TransformIndex; byte FF[76]; uint32 Unknown_2; uint32 Unknown_3; uint32 Unknown_4; uint32 ElementBufferOffset; // + 8 // Vertices / Normals / Colors // Stride 28 uint32 Unknown0BufferOffset; // + 8 uint32 UnitVectorBufferOffset; // + 8 // Unit Vectors // Stride 16 // 2 UV Sets // Local / World uint32 Unknown1BufferOffset; // + 8 uint32 TextureIndex; char Type[16]; uint32 Unknown_6; uint32 Unknown_7; uint32 MaterialDefCount; uint32 MaterialDefOffset; // + 8 uint32 IndexBufferOffset; // + 8 uint32 ElementCount_t; uint32 Unknown_8; float BBoxX,BBoxY,BBoxZ,Radius; }ShapeDefinition[ShapeCount]<optimize=false>; FSeek(TransformDefOffset + 8); struct { char MeshName[16]; float Matrix4x4[16]; }TransformDefinition[TransformCount]; FSeek(UnknownDef0Offset + 8); struct { char Name[16]; }Unknown0Definition[UnknownDef0Count]; FSeek(UnknownDef1Offset + 8); struct { char Name[16]; uint32 Unknown_0; uint32 Unknown_1; uint32 Unknown_2; uint32 Unknown_3; }Unknown1Definition[UnknownDef1Count]; FSeek(TextureDefOffset + 8); struct { char TextureName[16]; }TextureDefinition[TextureCount];Some progress....Noesis script. If anything went wrong just let me know. Some textures are missing from scene, maybe in another file.# Script by h3x3r from inc_noesis import * import noesis import rapi import os def registerNoesisTypes(): handle = noesis.register("UFC 3 - Mesh", ".ymx") noesis.setHandlerTypeCheck(handle, noepyCheckType) noesis.setHandlerLoadModel(handle, noepyLoadModel) noesis.logPopup() return 1 def noepyCheckType(data): bs = NoeBitStream(data, NOE_BIGENDIAN) if len(data) < 20: return 0 if bs.readUInt() != 0x4A424F59: return 0 return 1 def noepyLoadModel(data, mdlList): bs = NoeBitStream(data, NOE_BIGENDIAN) baseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName())) ctx = rapi.rpgCreateContext() rapi.rpgSetOption(noesis.RPGOPT_BIGENDIAN, 1) Underline = "_" TextureNameList = [] MeshNameList = [] TransformList = [] # Base Info bs.read(24) ShapeCount = bs.readUInt() ShapeDefOffset = bs.readUInt() + 8 TransformCount = bs.readUInt() bs.read(4) TransformDefOffset = bs.readUInt() + 8 bs.read(28) TextureCount = bs.readUInt() TextureDefOffset = bs.readUInt() + 8 # Texture Definition bs.seek(TextureDefOffset, NOESEEK_ABS) for i in range(0, TextureCount): CurPos = bs.tell() TextureNameList.append(bs.readString()) bs.seek(CurPos) bs.read(16) # Transform Definition bs.seek(TransformDefOffset, NOESEEK_ABS) for i in range(0, TransformCount): CurPos = bs.tell() MeshNameList.append(bs.readString()) bs.seek(CurPos) bs.read(16) TransformBytes = bs.read(64) TransformList.append(TransformBytes) # Shape Definition bs.seek(ShapeDefOffset, NOESEEK_ABS) for j in range(0, ShapeCount): ShapeNum = "{:04d}".format(j) ElementCount = bs.readUInt() bs.read(8) TransformIndex = bs.readUInt() - 1 bs.read(88) ElementBufferOffset = bs.readUInt() + 8 bs.read(4) UnitVectorBufferOffset = bs.readUInt() + 8 bs.read(4) TextureIndex = bs.readUInt() bs.read(32) IndexBufferOffset = bs.readUInt() + 8 bs.read(24) EndOfInfo = bs.tell() bs.seek(ElementBufferOffset, NOESEEK_ABS) bs.read(4) ElementBuffer = bs.read(ElementCount * 28) bs.seek(UnitVectorBufferOffset, NOESEEK_ABS) UnitVectorBuffer = bs.read(ElementCount * 16) bs.seek(IndexBufferOffset, NOESEEK_ABS) bs.read(8) IndexCountOffset = bs.readUInt() bs.seek(IndexCountOffset, NOESEEK_ABS) IndexCount = bs.readUInt() bs.read(4) IndexBuffer = bs.read(IndexCount * 2) rapi.rpgBindPositionBufferOfs(ElementBuffer, noesis.RPGEODATA_FLOAT, 28, 0) rapi.rpgBindNormalBufferOfs(ElementBuffer, noesis.RPGEODATA_FLOAT, 28, 12) rapi.rpgBindUV1BufferOfs(UnitVectorBuffer, noesis.RPGEODATA_FLOAT, 16, 0) rapi.rpgBindUV2BufferOfs(UnitVectorBuffer, noesis.RPGEODATA_FLOAT, 16, 8) rapi.rpgSetName(baseName + Underline + MeshNameList[TransformIndex] + Underline + ShapeNum) rapi.rpgSetMaterial(TextureNameList[TextureIndex]) rapi.rpgCommitTriangles(IndexBuffer, noesis.RPGEODATA_USHORT, IndexCount, noesis.RPGEO_TRIANGLE_STRIP) bs.seek(EndOfInfo, NOESEEK_ABS) mdl = rapi.rpgConstructModel() mdlList.append(mdl) return 1Tried to use the noesis script, and most of the files worked, but some did not giving this error. Most of these "error files" are the "oct" files. Seeing if re-extracting the game will help.Thanks for your help so far. Edited yesterday at 03:18 AM1 day by Zanthrman9 Changed how I typed the sentence, but get the same point across.
Yesterday at 01:04 PM1 day Author Sorry, should have clarified. It gives this error to all ymx files with oct in the name. As mentioned before, other ymx files are able to be viewed just fine, but for some reason, some cannot be opened.
Yesterday at 01:08 PM1 day Supporter Post them...EDiT: Yeah i see they are in octagon_00.pac etc... I will look at them.Found the problem. It reads invalid character at TextureName.Also these doesn't use 2 uv sets so i must create exception.EDiT: Updated script, you can try now. Edited 20 hours ago20 hr by h3x3r
18 hours ago18 hr Author On 7/18/2026 at 3:55 AM, h3x3r said:############################## get BaseFileName basename get FileExtension extension get FileSize asize endian big get ResourceCount uint32 getdstring Dummy 0x8 get TOCOffset uint32 goto TOCOffset for i = 0 < ResourceCount getdstring ResourceName 0x10 getdstring ResourceType 0x4 get ResourceSize uint32 get ResourceOffset uint32 getdstring Dummy 0x4 savepos cPos if ResourceType == "tex" goto ResourceOffset savepos ResourceBaseOffset get TexResourceCount uint32 getdstring Dummy 0x8 get TexTOCOffset uint32 for j = 0 < TexResourceCount getdstring ResourceName 0x10 getdstring ResourceType 0x4 get TexResourceSize uint32 get TexResourceOffset uint32 getdstring Dummy 0x4 savepos EndOfInfo math TexResourceOffset + ResourceBaseOffset math TexResourceSize - 16 goto TexResourceOffset getdstring Dummy 0x4 endian little get DecompressedSize uint32 getdstring Dummy 0x8 savepos Offset endian big goto EndOfInfo string Name p "%s/%s.%s" BaseFileName ResourceName ResourceType clog Name Offset TexResourceSize DecompressedSize next j goto cPos else string Name p "%s/%s.%s" BaseFileName ResourceName ResourceType log Name ResourceOffset ResourceSize endif next iI got the meshes from the octagon exported with no issues, but it seems that the .dds files the .tex quickbms script unpacks are unable to opened in GIMP, or PaintNET. Attached is a .dds file, not sure if it would be different compared to the ones you extracted. c_pad_c_n.dds
17 hours ago17 hr Supporter Hmmm strange... it's compressed. Tell me name of the file. I'll take a look.
13 hours ago13 hr Author 3 hours ago, h3x3r said:Hmmm strange... it's compressed. Tell me name of the file. I'll take a look.Had to zip up this one file to send it here. It should be this one. (it should also be in the stage folder named oct.tex if you still have it) oct.zip
7 hours ago7 hr Supporter That's wierd. When there is dds extension it should by uncompressed. But this one isn't. I will rewrite bms.
Create an account or sign in to comment