Leaderboard
Popular Content
Showing content with the highest reputation since 11/01/2025 in all areas
-
ID-Daemon tools source code
13 points
- 297 downloads
- Version 1.0.0
Here is the archive of all my source code as of July 2026. (with the exception of very few files related to asset encryption) You can use my sources for any free, non-commercial projects. However, as has always been the case, I'm against commercial, paid usage or paywalls. This includes selling tools, mods or models. There are also around 40 earlier projects related to audio/sfx/music extraction. Those will be published a bit later.13 points -
Battlefield 6 tools
7 points
- 1,215 downloads
- Version 1.1
Tools for Battlefield 6. Currently supports dumping the game, export models/maps. Usage is similar to previous tools for frostbite engine. toc_bf6.exe - dump tool Change .ini file parameters: - game path - dump path - selection to dump "ebx", "res", "chunks" or "all" Then drop any .toc file onto .exe to dump assets. Or run from command line with 1 parameter - toc file name. Fb_bf6_mesh.exe - model tool Takes .MeshSet as parameter. ske_soldier_3p.ebx - main universal skeleton for soldiers. Must be in the same folder. If you need another skeleton, use its name as 2nd parameter. Or rename it to ske_soldier_3p.ebx. Tool will try to find chunks automatically. If not, it gives error message with chunk name. Map export 1. Create database Run fb_maps_bf6_db.exe tool once, it will scan whole dump for meshsets and blueprints, so later maps can be converted fast, without the need to go into whole tree of assets. This will take a few minutes. After that, 2 files will be created: bp.db & meshnames.txt, which need to stay in the same folder with EXE for main tool to work. 2. Export maps Use fb_maps_bf6.exe (main map tool) to convert maps. Drop any EBX on it, use in command line with 1 parameter, or create a batch. 3. Terrain export Main terrain data is in .TerrainStreamingTree files for each level. For some levels, these files are small, which means the actual data is in chunks. Sometimes data is in the file itself, in this case it may be big, about 50mb in size. Drop .TerrainStreamingTree on fb_terrain_bf6.exe or use command line.7 points -
Findings Summary – MPK Patch vs Resource Analysis (Where Winds Meet)
Author: Myro Scope: Educational & research-oriented reverse engineering Status: Ongoing research Introduction: This thread documents an ongoing technical research project focused on analyzing the MPK container system used by Where Winds Meet (WWM). The goal is to understand the structure, behavior, and data flow of the game’s asset containers from a reverse-engineering and archival perspective, strictly for educational and analytical purposes. No proprietary assets, binaries, or tools will be distributed as part of this work. 1. Patch*#.mpk vs Resource*#.mpk — Structural Similarity, Semantic Differences At a container level, Patch#.mpk* and Resource#.mpk* share the same base format: Indexed via mpkinfo / mpkdb Entries contain: FileID Size Offset MpkIndex Use the same compression stack: LZ4 / ZSTD / LZMA EZST (AES-encrypted) However, despite this structural similarity, their extraction semantics differ significantly. 2. Patch*#.mpk — Partial Transparency, Direct Asset Access Patch MPKs behave primarily as delta / override containers: Assets retain near-original offsets Internal file structures remain largely recognizable Minimal indirection compared to Resource MPKs As a result: ~99% of audio assets can be recovered successfully A subset of Lua scripts becomes readable after decompression Non-audio assets (including some images) are present and partially accessible Testing on Patch3100.mpk confirmed that Patch archives are not limited to sound assets. Conclusion: Patch MPKs prioritize update efficiency and fast access, with limited transformation of payload data. 3. Resource*#.mpk — Indirection and Shared Data Resource MPKs represent the primary asset pool and introduce several additional complexities: The Size field often represents a logical or expanded size, not the physically stored payload Naïve extraction pipelines tend to: materialize padding and alignment blocks duplicate shared data blobs inflate archive size artificially (e.g. ~2 GB → tens of GB) This behavior explains why Resource MPKs appear far more “opaque” when extracted without validation. Important observations: Fixed headers such as 02 02 02 01 … frequently represent logical structures (e.g. texture containers with multiple mip blocks) Headers of the form size (4 bytes) + size × 20 bytes often describe lookup tables, not standalone assets Many assets are shared, aliased, or referenced indirectly Conclusion: While Patch and Resource MPKs share the same container format, they do not share the same extraction semantics. Resource MPKs require strict validation, deduplication, and asset-type verification to avoid false positives. 4. Audio Extraction & Tooling Initial testing with Ravioli Game Tools proved sub-optimal for this pipeline: Inconsistent parsing of Patch audio assets Unreliable WAV output in multiple cases Switching to vgmstream yielded significantly better results: Correct parsing of recovered audio data Clean, fully functional WAV output Proper handling of codec structures Current result: Audio extraction and conversion are fully verified and stable. 5. Resource.mpk Extraction – Current Progress Testing on Resources49.mpk (~740.9 MB) produced the following results: Successfully extracted: Audio assets → converted to valid .wav files Over 8,500 audio files identified in a single Resource MPK Video files (.mp4) → fully playable Lua scripts (.lua) → extracted but still encrypted / obfuscated Unresolved: Files detected as images (.png, .jpg, .bmp) Headers contain the string “messiah” Strongly suggests custom packing, encryption, or misclassification Currently not valid image data despite file extensions 6. Current Status ✔️All Patch*#.mpk, Resource*#.mpk, and lt*.mpk archives can be unpacked ✔ Audio assets fully recovered and validated ✔ MP4 video assets fully playable ✔ Lua scripts extracted but not yet readable 7. Next Steps Ongoing research will focus on: Reversing additional transformation layers in Resource*#.mpk Identifying: secondary encryption stages compression chaining block or stream reordering Investigating the custom image container format Further analysis of Lua encryption / obfuscation Automating Patch vs Resource handling as two distinct pipelines Notes on Tooling & Distribution All tools used in this project are: developed entirely from scratch created specifically for WWM research used strictly for educational purposes At this stage: no tools, binaries, or scripts will be released no proprietary assets will be redistributed Closing This thread is intended solely as a technical research and documentation log, not as a release, redistribution, or exploitation guide. In accordance with applicable intellectual property laws and forum policies, no tools, binaries, scripts, or extracted assets will be posted or shared, either publicly or privately. All game data, assets, file formats, and related materials discussed here remain the exclusive proprietary property of NetEase and the developers of Where Winds Meet. Any references to assets or file structures are made strictly for educational, analytical, and research purposes, with no intent to enable misuse, circumvention, or redistribution of protected content. Should any concerns arise regarding compliance or scope, I am fully open to cooperating with forum moderation and adjusting the visibility or content of this thread accordingly. Thank you for your understanding and for supporting responsible technical research. — Myro Below are a few illustrative screenshots and log excerpts from the current stage of the research, provided solely to contextualize the findings outlined above.7 points
-
Fate Grand Order Arcade .mot file
6 pointsWe are currently testing whether we can retrieve character IDs from the database and read all related data6 points
-
[Tutorial] How to translate a ROM
5 points5 points
- Battlefield 6 [updated] tool
5 pointsHere is experimental version of dump tool for full version of Battlefield 6. (attached in the end of this post) For almost a whole year now since beta versions it was possible to use my set of tools to get ANY files from it, be that beta or full version. The only problem was "update" folder that was not supported as it is. To get it dumped, you had to move files from update folder to data folder. Each subfolder inside "update" has "data" inside, and you have to move contents to main "data" folder. It does not overlap and work as intended. Now i made this new version which must scan update folder and add data from it. Important change of .INI file is that now game path must NOT include "data" in the end: C:\games\bf6 D:\dump all After dumping, you can use same set of tools from here: bf6_update.7z5 points- Death Stranding 2 On The Beach models
Modding tools in progress (details in discord, forum thread will be created later). The first ever custom model in DS2. Extracted from the game, modified, and put back into it.5 points- Fate Grand Order Arcade .mot file
5 points5 points- EA Font Manager
5 points- 47 downloads
- Version 0.7.1
Program for handling FFN, PFN, XFN, MFN and SFN fonts from EA games List of functionalities: - Parsing EA Font files - Preview for font images - Decoding and viewing font flags - Viewing/Editing character table - Exporting font images as DDS, PNG or BMP - Importing font images from DDS, PNG or BMP5 points- A Plague Tale Games Font and Localization Tool
- 109 downloads
- Version 1.0
A Pague Tale Games Font and Localization Tool - FEARka Tools for editing text and font files from all three A Plague Tale games: Innocence, Requiem and Resonance. It supports .pc and .IGN file export, import and comparison, as well as DPC font extraction, TTF/OTF atlas rebuilding and font import. The package includes separate GUI applications for localization and font editing. Python 3.10 or newer is required. Font atlas rebuilding uses the included msdf-atlas-gen.exe. Testing has been performed with the BIG_FONT, SMALL_FONT and SMALL_FONT_02 mappings, using the included TTF files and their default font sizes. Other mappings, fonts or custom sizes may require additional testing.4 points- Dreamcast-Kita e Series .cb and .pvr
4 pointsi took a look at the .CB file and managed to crack it. 1. ENC0 / ENC2 are not encryption ENC is short for *encoding*, and the digit is the method number. *ENC0 — stored, no compression.** The CLSS blob follows the 8-byte header verbatim. That is exactly why CLSS / CTRFImageBuffer / IBUF were readable in a hex editor in the first place. The LZSS chunks live *inside* that blob. Every image resource in SSYF.CB is ENC0. *ENC2 — the whole record is LZSS-compressed.** Same bitstream as below, but with no 4-byte size prefix; the decompressed size is the resource size already in the TOC. Only the 20 .SET files use it. 2. The compression Chunk layout "LZSS" | u32 chunk_size | u32 decompressed_size | bitstream - Bits are read LSB-first within each byte — bit 0, then bit 1, … bit 7. - Multi-bit fields are assembled MSB-first — the first bit read is the field's most significant bit. Grammar. - flag bit 1 → literal: the next 8 bits are emitted directly. - flag bit 0 → match: 12-bit ring position, then 4-bit length, length = field + 2 (so 2..17 bytes). Window. - A 4096-byte ring buffer, initialised to 0x00, write pointer starting at 0. - pos is a 1-based ring index, so the copy source is ring[(pos - 1 + i) & 0xFFF]. pos == 0 never appears in a real token. - Every copied byte is written back into the ring at the write pointer, as usual. - The stream ends as soon as the declared byte count is produced. There is no end marker, and up to 2 bytes of zero padding follow. int bitpos = 0; int getbit (const u8 *s) { int b = (s[bitpos>>3] >> (bitpos&7)) & 1; bitpos++; return b; } u32 getbits(const u8 *s, int n) { u32 v = 0; while (n--) v = (v<<1) | getbit(s); return v; } u8 ring[4096] = { 0 }; u32 r = 0, o = 0; while (o < decompressed_size) { if (getbit(src)) { /* 1 = literal */ u8 c = getbits(src, 8); out[o++] = c; ring[r] = c; r = (r + 1) & 0xFFF; } else { /* 0 = match */ u32 pos = getbits(src, 12); /* 1-based ring index */ u32 len = getbits(src, 4) + 2; /* 2..17 */ u32 s = (pos - 1) & 0xFFF; for (u32 i = 0; i < len; i++) { u8 c = ring[(s + i) & 0xFFF]; out[o++] = c; ring[r] = c; r = (r + 1) & 0xFFF; } } } One chunk decompresses to at most 0x20000 bytes. Bigger images are split across consecutive LZSS chunks that concatenate to exactly width * height * 2. 3. The .dds files — CTRFImageBuffer "CLSS" | u32 len | class name, NUL-terminated ("CTRFImageBuffer") "IBUF" | u32 size | u32 (0) | u16 width | u16 height | u16 pitch (= width*2) | u16 planes (1) | u32 flags (0x00100000) | u32 mask A | u32 mask R | u32 mask G | u32 mask B | u8 bits A, R, G, B (e.g. 0, 5, 6, 5) | u8 top bit index A, R, G, B (e.g. 0, 15, 10, 4) then 1..n LZSS chunksThe pixel data is a plain linear raster 4. The .SET files, and exact frame reassembly Once decompressed, each .SET is a serialised CTRFDataSet that names the textures for a scene and gives the blit rectangles — so reassembly is read from the data. "CLSS" | u32 len | "CTRFDataSet\0" | u32 nrec per record: FF FF FF FF | u32 id | u16 namelen | name | payload CTRFTexture u32 | u32 count | count x NUL-terminated .dds names CTRFPictures u32 | u32 npics npics x ( u16 (0x10) | u16 npieces | u16 W | u16 H | u16 ox | u16 oy npieces x ( u32 texture index u16 sx0 sy0 sx1 sy1 <- inclusive source rect u16 dx0 dy0 dx1 dy1 )) <- inclusive dest rect npics x NUL-terminated picture name <- names come after ALL pictures u32Note that the picture names come after all the pictures, The typical scene is 640x480 built from three pieces: 512x480 from the _00 texture, then the _01 texture folded in half to supply the right-hand 128x480 strip. tex0 src (0,0)-(511,479) -> dst (0,0)-(511,479) tex1 src (0,0)-(127,255) -> dst (512,0)-(639,255) tex1 src (128,0)-(255,223) -> dst (512,256)-(639,479)A few sets sSYf_11) store frames at half vertical resolution and give a destination rect twice as tall — i.e. the game line-doubles them. Other record types are present CTRFContainer, CTRFClipperBuilder, CTRFPictureDraw, and TEXT / PICT / ANIM / LIPS / CLIP sections), but none are needed for images. Script attached: kitae_cb.py python kitae_cb.py .CB FILE -o extracted --assemble python kitae_cb.py .DDS FILE -o extracted # loose CLSS/IBUF file kitae_cb.py4 points- .pak avatar legends the fighting game
The attached script will dump everything that is inside of the .sprbin files. This includes the FSB files. I am cheating a little bit as I am using vgmstream-cli to do the heavy lifting for me. The FSB files are still available raw. Hope you will excuse me. 🥺 python .\SPRBIN_Extractor.py "path\to\folder\with\sprbin\files" "path\to\export\folder"Full list of resources this is currently extracting: Audio: Raw FSB files WAV converted through embedded vgmstream-cli Localization: CSV files containing game text Palettes: RGBA palette data PNG palette overview CSV for individual palette colour values Tables: Symbols: Named IDs used by the SPRBIN script Frames: Main sprite-frame records and source image paths Frames Extra: Additional values attached to individual frames Frame Placement: Objects or sprite positions associated with frames States: Animation or behavior-state records State Strings: Strings inside of compiled state data Pairs: Pairs of unidentified values stored in the frame and state data Palette Records: Details about embedded colour palettes and the images that use them Dependencies: External asset paths referenced by the SPRBIN SPRBIN_Extractor.7z4 points- Prince of Persia Sands of Time - .int Video file
Hello, this is a proprietary format from Ubisoft. After long months, I made an tool to handle this format. Check this out: Sources: https://github.com/OAleex/Ipu-Codec https://github.com/OAleex/Ubisoft-Int Ipu-Codec-v1.0.0-win-release.zip Ubisoft-Int-v1.0.0-win-release.zip4 points- The Amazing Spider-Man 1 and 2
4 pointsNew Version of TASM 1+2 Tools Audio is now sorted/named Also sorted into languages.4 points- Fate Grand Order Arcade .mot file
4 points4 points- [Xbox] Conker Live and Reloaded models
Apparently there is a bug with Default Berri's hair Fur Shells are currently merging her Hair and Body material, due to an oversight in how the shells are drawn, getting a fix done now EDIT Here's the updated script RBMimport_12.py4 points- [Xbox] Conker Live and Reloaded models
Here is the newest version most animations should work, I haven't tested everything yet added a search bar to make it easier to find assets you have loaded I tried to speed up the animation loading, but I don't think there is a real way to do it at this moment unless I worked on the memory stuff, right now its decrypting each frame, then keyframing it, so they can take about 3 to 4 minutes if you want to load another animation, its better to just refresh the scene, current bug is that the animation unloader has some memory cache'd for a few bones that I haven't been able to quash yet. sometimes the clear animation buttons works though I'm currently working on another Conker project, if that goes anywhere then I'll announce it here RBMimport_12.py4 points- [Xbox] Conker Live and Reloaded models
Movement now works Here is the new script RBMimport_12.py Whats new Script will create custom materials based on shader, for example, Conker will now have proper material setups for his eyes and fur Fur support Animation support: currently only Conker's animations work from the Anims/Conker/default.rbm file to import an animation load model settings must look like this to work find animation rbm *Anims/Conker/Default.rbm* select the animation you want wait for it to process (Can be slow due to printing debug logs)4 points- [Xbox] Conker Live and Reloaded models
got the poses to actually work, the blocker was a stupid piece of debug code I didn't notice was causing the orientation to flip when baking to the skeleton4 points- [Xbox] Conker Live and Reloaded models
just to update everyone, I've gotten close, I had to scrap what I was doing multiple time, and decided the only way to get the animation to properly import is if I mirrored the stack building exactly, which I've seemingly accomplished, now the new issue is, I need to fix the skeleton's orientation upon import, because even though the animation pose imports, Conker looks dead this animation is the stance clip, used for his idle animation as you can see, once I fix the bind pose on the imported models, it should allow for the animation to be positioned correctly4 points- Konjiki no Gashbell!! Gekitou! Saikyou no Mamono-tachi (PS2) File OUT2.CAR
Let the SLPS in the same folder of out2.car and use this script below in quickbms selecting out2.car #Konjiki no Gashbell extractor by Rabatini open FDSE "SLPS_254.40" 1 get ARCHIVE_SIZE asize 0 get SLPS_SIZE asize 1 set BASE_LSN long 311 set VADDR_BASE long 0x247A80 set FILE_BASE long 0x148A80 set SCAN_START long 0x001000 math SCAN_END = SLPS_SIZE math SCAN_END - 0x1c set FOUND long 0 for POS = SCAN_START < SCAN_END goto POS 1 get NAME_PTR long 1 get TAG long 1 get LSN long 1 get SECTORS long 1 get ALLOC long 1 get SIZE long 1 get FLAGS long 1 if TAG == 0xFFFFFFFE math EXPECT = SECTORS math EXPECT * 0x800 if EXPECT == ALLOC if SIZE > 0 if SIZE <= ALLOC math OFFSET = LSN math OFFSET - BASE_LSN if OFFSET >= 0 math OFFSET * 0x800 math END_OFF = OFFSET math END_OFF + SIZE if END_OFF <= ARCHIVE_SIZE set DUP long 0 for J = 0 < FOUND getarray OLDLSN 0 J if OLDLSN == LSN set DUP long 1 break endif next J if DUP == 0 putarray 0 FOUND LSN math FOUND + 1 string NAME p= "files/%05d_%08x_%08x.bin" FOUND LSN SIZE # tenta resolver o nome pelo ponteiro da entrada math NAME_OFF = NAME_PTR math NAME_OFF - VADDR_BASE math NAME_OFF + FILE_BASE if NAME_OFF >= 0 if NAME_OFF < SLPS_SIZE goto NAME_OFF 1 getct TMP string 0x00 1 if TMP != "" string NAME = TMP endif endif endif log NAME OFFSET SIZE 0 endif endif endif endif endif endif endif # o for adiciona +1 no next, então aqui somamos +3 = passo real de 4 bytes math POS + 3 next POS Konjiki no Gashbell extractor by Rabatini.zip4 points- Death Stranding 2 mod tool [with custom model import]
- 222 downloads
- Version 0.22
Work in progress, version 0.2 For instructions and support join reshax discord: https://reshax.com/topic/138-reshax-discord-server Its features/usage are same as Horizon Forbidden West tool. Currently, we must be able to replace any mesh and texture in the game. Also can mod anything else (any asset or property) if you know where it is, and its not breaking existing asset layout.4 points- Indiana Jones and the Great Circle - .resources
Hey there people! I've been lurking these forums for years now, Zenhax and Xentax as well, but haven't shared my tools (mainly because there were already working solutions from other people). This whole community is about sharing your knowledge and tools (and I know some people who have tools for other games, but won't share it with the community). Because I've just created a working solution I'd thought it would be best to share it with you guys. This would be my first post here, but don't let that distract you 🙂 HOW IT WORKS: 1. First you need to open your GMAIL account and open a Google Colab page ( https://colab.research.google.com/ ). 2. Click on the "New Notebook" option. 3. You'll see a folder that contains files, click on it! You'll have to wait a few seconds before it connects to the server. 4. Once you see the file structure (like the "sample_data" folder), drag and upload your original "gameresources_patch1_pc.resources" and your modified "strings" file there. 5. If it's done, then on the top you can see a console with a play button. Insert the whole script I've sent you, then press the Play button. 6. After a few seconds the console / log on the bottom should say that it's finished, and on the left you'll see a file called "NEW_gameresources_patch1_pc.resources". 7. Download that file and insert it into your game folder, renaming and replacing the original one (make sure you create a backup of it). 8. Run the game and it should work with your new strings. EDIT: My script targets the English language files and replaces the strings there. If you want to replace another language's files (maybe because of the fonts), you can update the script's eb value. EN_US (original): eb = 0x3D858 AR_SA: eb = 0x3D8E8 DE_DE: eb = 0x3DA98 ES_ES: eb = 0x3DB28 ES_MX: eb = 0x3DD68 FR_FR: eb = 0x3D978 IT_IT: eb = 0x3DA08 JA_JP: eb = 0x3DCD8 KO_KR: eb = 0x3DFA8 PL_PL: eb = 0x3DC48 PT_BR: eb = 0x3DDF8 RU_RU: eb = 0x3DBB8 ZH_CN: eb = 0x3DF18 ZH_TW: eb = 0x3DE88 Have fun! EDIT 2: I've updated my script, so it will automatically download the file with the correct name once it's done patching it, and also I've created a patcher for the PS5 version (since the original tool was only working for the PC version). Note that the entries differ for the PS5 version, so you can't use the above "eb" values for it! script_ps5.py script_pc.py4 points- Need help extracting .paz / .pamt files from Crimson Desert (BlackSpace Engine)
I've updated my browser to include ChaCha20 stuff by Lazorr. Seems to work fine, but i guess once he updates his gui (currently it's even worse than this here :P), mine won't be needed anymore. Let's GO!!! 😄 Crimson Browser3.zip4 points- Fate Grand Order Arcade .mot file
4 pointsWe are currently rewriting the code to support all animations.4 points- [Xbox] Conker Live and Reloaded models
I've been so busy at work lately, but here is the version with fixed material batching RBMimport_noAnimation5.py4 points- [Xbox] Conker Live and Reloaded models
Here is an updated version of the script What Changed: Added shader type detection Specular textures will now correctly pipe into the specular node Textures with a Cutout Alpha now correctly pipe into the alpha channel Fur is currently being worked on Added more attributes to the model Vertex Color is now supported Fur Length is now being collected (not fully implemented yet) Fixed an issue where some models never importing textures or materials I'll also update the original script post EDIT I'll be updating it again soon, appears some models have separate specular textures rather than them just deriving from the alpha, mostly the Barn_outside models RBMimport_noAnimation2.py4 points- Broken Sword - Shadow of the Templars (1996) .clu tools
- 31 downloads
- Version 1.0.0
Broken Sword - Shadow of the Templars (1996) * bs1_1996_clu_export.py * bs1_1996_clu_import_and_patch.py Required: Python. When installing, make sure to check “Add python.exe to PATH.” Usage: * Copy the swordres.rif and text.clu files into the same folder as the .py files. * Run bs1_1996_clu_export.py: this will extract the texts into Text_exported.txt. * Translate it, then rename the finished file to Text_translated.txt. * Run bs1_1996_clu_import_and_patch.py: this will insert the translated texts back into text.clu and modify swordres.rif. * The new files will be created with the _new suffix. Tested with GoG (2.0.0.8) and Steam Reforged Free DLC FEARka4 points- Fate Grand Order Arcade .mot file
4 points- EA Madden compression source
3 pointsHi guys, with the help of an AI agent, I decompiled the ea_madden_dump[] binary that is in ea_madden.c written by Aluigi Auriemma. The result is a functional decoder written in pure C for the NFL 07 game files. Here the link for the source: https://github.com/RayneDuarte/Madden-NFL-07-Decompressor3 points- Reverse engineering the extraction of Game Archives using QuickBMS/Python
Today I am gonna discuss on how we can reverse engineer the extraction of the game archives, sit back because this is where it starts to get interesting... +==== TUTORIAL SECTION ====+ But how do those files store game assets like 3D Models, Textures, Sounds, Videos and etc... Well, the anwser is simple, they usually bundle them, they pack them close together in their eighter compressed or even encrypted form (Rarely). To understand let's first quickly move into the basics, into how the Computer stores any file at all. DATA TYPES Those are the most frequent Data types: Byte/Character = 1 Byte, so 8 Bits Word/Short = 2 Bytes, so 16 Bits Dword/Int = 4 Bytes, so 32 Bits ULONG32/Long = 4 Bytes, so 32 Bits ULONG64/Long Long = 8 Bytes, so 64 Bits Float = 4 Byte, so 32 bits Double = 8 Bytes, so 64 Bits String = A sequence of 1 Byte Characters terminated with null ("00") Where Bit is literally one of the smallest Data that we can present, it's eighter 0 or 1 but combining those 8 Bits together (Example: 0 1 1 1 0 0 1 1) so we get a whole byte. So, all files literally look like this: Addres: HEX: ASCII: 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0x00000040 2a 2a 20 2a 2f 0a 09 54 61 62 6c 65 20 77 69 74 ** */..Table wit 0x00000050 68 20 54 41 42 73 20 28 30 39 29 0a 09 31 09 09 h TABs (09)..1.. 0x00000060 32 09 09 33 0a 09 33 2e 31 34 09 36 2e 32 38 09 2..3..3.14.6.28. 0x00000070 39 2e 34 32 0a 9.42. This is called a Hex dump, it's essentially a mkore human readable code of binary file that aside the actual Binary data in HEX shows us the Adresses and the ASCII representation for each 0x..0 to 0x..F line. The packed file usually contains compressed data and a small separator/padding between them, hover it doesn't tell us the name and the path of the file we want to com press, whch is a problem. Heck, we don't even know which compression method was used and which "flavour/version" and how the decompressed file should look like... That's where QuckBMS comes to help. QuickBMS QuickBMS has one very specific function I wanna talk about, it's "comptype unzip_dynamic" it supports millions methods and their "flavours/versions". It has also a very fast perfomance and is good for extracting the multiple files out of the package at once. There are also already lots of QuckBMS scripts out there for extracting specific archives, but I'll talk about that later. Compression types As said previously, the block separators/markers are very usefull to identify but turns out most of the compression methods have their own headers and magic numbers, here are few of them: Magic numbers: ZLIB: 78 01 (NoComp) 78 5E (Fastest) 78 9C (Default) 78 DA (Maximum) LZ4: [No Magic Numbers] LZ4 Frame: 04 22 4D 18 (Default) LZW: [No Magic Numbers] LZO: [No Magic Numbers] BZIP/BZIP2: 42 5A 68 GZIP: 1F 8B 08 Practical steps Below is the example of how average QuickBMS Archive extractor looks like, it's also one of my first favourites and the first one, it's designed for extraction of assets from Wolfenstein: The New Order & Wolfenstein: The Old Blood: wolfenstein.bms: open FDDE index 0 open FDDE resources 1 comtype unzip_dynamic endian big goto 0x24 get files long get unk long math TMP = files math TMP - 1 for i = 0 < files endian little get FNsize1 long getdstring FN1 FNsize1 get FNsize2 long getdstring FN2 FNsize2 get namesize long getdstring name namesize endian big get offset long get size long get zsize long get unksize long math unksize * 0x18 math unksize + 5 getdstring unkdata unksize if size = zsize log name offset size 1 else clog name offset zsize size 1 endif if i != TMP get filenumber long endif next i Script summary: Open index + data files Read file count For each file: Read filename Read offset and sizes Skip metadata Extract raw or compressed data Compression logic ConditionAction | size == zsizeRaw copy | | size != zsizeZlib decompress | In ID Tech 5, games have all assets packed inside the .resources files and all of the metadata like name, path, extension, compressed size, decompressed size are in the .index files that means is that we open both files in this way: 1. Setup open FDDE index 0 open FDDE resources 1 open = tells QuickBMS to open files. FDDE = the format ID (arbitrary, just a label). index -> is opened as file 0 resources -> is opened as file 1 comtype unzip_dynamic 2. Loop This sets compression to Zlib dynamic (handles soo many decompressions). endian big This sets reading data in Big-Endian. goto 0x24 Jumps to 0x24 to skip archive header get files long get unk long files -> total number of files in the archive unk -> unknown value (probably versioning or flags) math TMP = files math TMP - 1 TMP = holds files - 1 (Used later to avoid reading an extra value after the last entry). for i = 0 < files The script now iterates once per file entry. endian little The filename block is little-endian, even though the rest of the archive is big-endian. get FNsize1 long getdstring FN1 FNsize1 Reads length of string Reads string data get FNsize2 long getdstring FN2 FNsize2 Another string component get namesize long getdstring name namesize This is the real filename name is used later by log / clog This determines the extracted file name on disk endian big Switch back to big-endian. get offset long get size long get zsize long offset = Where the file data is located in resources size = Uncompressed size zsize = Compressed size get unksize long math unksize * 0x18 math unksize + 5 getdstring unkdata unksize Reads a count (unksize) Multiplies it by 0x18 (24 bytes per entry) Adds 5 extra bytes Skips a block of unknown metadata This is not used for extraction, only skipped to reach the next file entry. 3. Extract the files if size = zsize log name offset size 1 If compressed size equals uncompressed size: File is stored raw log copies data directly from file 1 (resources) else clog name offset zsize size 1 endif clog means compressed log Reads zsize bytes Decompresses using unzip_dynamic Writes size bytes to disk if i != TMP get filenumber long endif Between entries, there is an extra long Probably an ID or index value Not present after the last entry This prevents reading past the table next i Repeats until all files are extracted3 points- [PC]CONTROL Resonant
3 pointsTool supporting Alan Wake 2, Control, and FBC available: GitHubGitHub - Scobalula/Janitor: An asset extractor for Northl...An asset extractor for Northlight Engine games. Contribute to Scobalula/Janitor development by creating an account on GitHub.3 points- [Xbox 360 + PlayStation 3] Rio the Video Game // GoldenEye 007 Reloaded - .edb, .geo, .dat
I just figured out how to load external files like materials, textures. But absolute path must be set. I also noticed that *.entity is invoked by skeleton if there's any. External dds loading. But there is still one big issue. How are meshes handled. I still didn't figure out how indices reset. Holy sh!t it automatically converts textures to dds in cooperation with my script for textures3 points- Dreamcast-Kita e Series .cb and .pvr
3 pointsThe PVR files look to be LZSS0 compressed from offset 8, and one of the files I tested (IMG0088_A) is 512x512 BGRA5551 with DC swizzling. Something like this:3 points- Deadly Premonition PC .XMD
3 pointsWorking on it... But struggling with decompression via noesis. You need to use BMS first to decompress *.XMD. Or maybe i'll figure out. EDiT: Figured out. Now you don't need to decompress model... Here we go... # Script by h3x3r from inc_noesis import * import noesis import rapi import os def registerNoesisTypes(): handle = noesis.register("Deadly Premonition - XMD Mesh", ".xmd") noesis.setHandlerTypeCheck(handle, noepyCheckType) noesis.setHandlerLoadModel(handle, noepyLoadModel) noesis.logPopup() return 1 def noepyCheckType(data): bs = NoeBitStream(data) bs.read(8) CSize = bs.readUInt() Size = bs.readUInt() Buffer = bs.read(CSize) data = rapi.decompInflate(Buffer,Size) bs = NoeBitStream(data) if len(data) < 20: return 0 if bs.readUInt() != 0x33444D58: return 0 return 1 def noepyLoadModel(data, mdlList): bs = NoeBitStream(data) bs.read(8) CSize = bs.readUInt() Size = bs.readUInt() Buffer = bs.read(CSize) data = rapi.decompInflate(Buffer,Size) bs = NoeBitStream(data) baseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName())) ctx = rapi.rpgCreateContext() Underline = "_" # Main Info Sign = bs.read(4) ResourceSize = bs.readUInt() TotalIndexCount = bs.readUInt() TotalElementCount = bs.readUInt() Unknown_2 = bs.readUInt() Reserved0 = bs.read(20) Unknown_3 = bs.readUShort() BoneCount = bs.readUShort() ShapeCount = bs.readUInt() Unknown_4 = bs.readUInt() Unknown_5 = bs.readUByte() Unknown_6 = bs.readUByte() Unknown_7 = bs.readUByte() Unknown_8 = bs.readUByte() Unknown_9 = bs.readUByte() ElementStride = bs.readUByte() NormalSkinStride = bs.readUByte() Unknown_12 = bs.readUByte() Reserved1 = bs.readUInt() BBoxMin = bs.read(12) BBoxMax = bs.read(12) Unknown_13 = bs.readUShort() Unknown_14_Count = bs.readUShort() Unknown_15 = bs.readUInt() Unknown_16 = bs.readUInt() MaterialDefOffset = bs.readUInt() BoneDefOffset = bs.readUInt() ShapeDefOffset = bs.readUInt() Unknown_17 = bs.readUInt() Unknown_18 = bs.readUInt() UnknownDefOffset = bs.readUInt() Reserved2 = bs.read(16) IndexBufferBaseOffset = bs.readUInt() ElementBufferBaseOffset = bs.readUInt() NormalSkinBufferBaseOffset = bs.readUInt() Reserved3 = bs.read(16) Unknown_14_Offset = bs.readUInt() print("Element Stride >",ElementStride,"NormalSkin Stride >",NormalSkinStride) # Material Info bs.seek(MaterialDefOffset, NOESEEK_ABS) MaterialName = bs.readString() rapi.rpgSetMaterial(MaterialName) # Shape Info bs.seek(ShapeDefOffset, NOESEEK_ABS) for i in range(0, ShapeCount): StrPos = bs.tell() ShapeName = bs.readString() bs.seek(StrPos, NOESEEK_ABS) bs.read(16) Unknown_0 = bs.readShort() BoneId = bs.readShort() Unknown_2 = bs.readUInt() Unknown_3 = bs.readUInt() BBoxMin = bs.read(12) BBoxMax = bs.read(12) IndexCount = bs.readUInt() ElementCount = bs.readUInt() IndexOffset = bs.readUInt() * 2 ElementOffset = bs.readUInt() Unknown_4 = bs.readUInt() Reserved = bs.read(8) cPos = bs.tell() bs.seek(ElementBufferBaseOffset + (ElementOffset * ElementStride), NOESEEK_ABS) ElementBuffer = bs.read(ElementCount * ElementStride) if ElementStride == 20: rapi.rpgBindPositionBufferOfs(ElementBuffer, noesis.RPGEODATA_HALFFLOAT, 20, 0) rapi.rpgBindUV1BufferOfs(ElementBuffer, noesis.RPGEODATA_HALFFLOAT, 20, 8) elif ElementStride == 24: rapi.rpgBindPositionBufferOfs(ElementBuffer, noesis.RPGEODATA_FLOAT, 24, 0) rapi.rpgBindUV1BufferOfs(ElementBuffer, noesis.RPGEODATA_HALFFLOAT, 24, 12) bs.seek(NormalSkinBufferBaseOffset + (ElementOffset * NormalSkinStride), NOESEEK_ABS) NormalSkinBuffer = bs.read(ElementCount * NormalSkinStride) if NormalSkinStride == 12: rapi.rpgBindNormalBufferOfs(NormalSkinBuffer, noesis.RPGEODATA_HALFFLOAT, 12, 0) rapi.rpgBindBoneWeightBufferOfs(NormalSkinBuffer, noesis.RPGEODATA_HALFFLOAT, 12, 6, 3) elif NormalSkinStride == 16: rapi.rpgBindNormalBufferOfs(NormalSkinBuffer, noesis.RPGEODATA_HALFFLOAT, 16, 0) rapi.rpgBindBoneWeightBufferOfs(NormalSkinBuffer, noesis.RPGEODATA_HALFFLOAT, 16, 8, 3) bs.seek(IndexBufferBaseOffset + IndexOffset, NOESEEK_ABS) IndexBuffer = bs.read(IndexCount * 2) rapi.rpgSetStripEnder(0xFFFF) rapi.rpgSetName(ShapeName) rapi.rpgCommitTriangles(IndexBuffer, noesis.RPGEODATA_USHORT, IndexCount, noesis.RPGEO_TRIANGLE_STRIP) bs.seek(cPos, NOESEEK_ABS) mdl = rapi.rpgConstructModel() mdlList.append(mdl) return 1No skin/bones/skeleton. Could be done later...3 points- [Xbox] Conker Live and Reloaded models
I guess now that I'm actually getting some progress going, the next project I'm working on is an actual game loader, it won't be in blender. Blender is just a debug space for it. so technically what it will be is like those Mario 64 loader where you have to provide your own game root folder, but once loaded, it will allow you to mod the game, and stuff like that. Still a lot of functions I need to go through, but its getting there, hopefully everything goes alright3 points- Unreal Engine 4-5 Font Tool
3 points- 205 downloads
- Version 1.0.0
Requirements Python 3.10 or newer installed on your system. (Note: Make sure to check the "Add Python to PATH" box during installation. No additional modules are required.) How to use Add your files: Place your original Unreal Engine font files (.uasset + .uexp pairs, or .ufont files) into the source folder. Export: Double-click export.bat. The tool will extract the fonts and save them to the ttf_otf folder. Edit or Replace: Go to the ttf_otf folder and modify the extracted .ttf or .otf files, or replace them with your custom fonts. (Important: The replaced files must keep the exact same names as the exported ones!) Import: Double-click import.bat. The tool will repack your modified fonts back into the original UE formats. Done: You can find your newly generated, ready-to-use game files in the NEW folder.3 points- [Xbox] Conker Live and Reloaded models
good news is I now got animation poses showing correctly Bad news, I need to fix the bind pose for the imported armature3 points- Ghost of Yotei tool [ps5]
3 points- 61 downloads
- Version 1.0.0
Tool can now export only skeletal models & textures. Works similar to previous tsushima tool, but there are some important differences. Main hero model has too many optional parts (outfits/armors) so i decided to make an optional filter to only output selected parts. Same for NPCs, enemies etc. All models in the game (at least from what i know) are described in XPPS files. Those with names starting from core_common_subcore... There are 12 such files for enemies/npcs/animals etc, and a separate hero.xpps file for main hero. Usage: 1. change path in .ini file 2. drag XPPS file with models onto yotei.exe (or run it from cmd) this will make a list of all skeletal meshes in that file 3. copy new created .txt file and name it filter.txt then edit it (if needed) - delete some lines, so it only has the part you need 4. repeat step 2 this will now export models and material lists Texture export: run the tool from command line: yotei.exe tex This will export ALL textures. If you only need some, remove unwanted textures from cache_ps5\bitmaps folder Important notes: - some meshes (mostly heads) have double skins (two sets of weights/bone indices), which require to setup 2 skeleton modifiers to work properly. This feature will be described later in more details; - some meshes are borrowed from other xpps files, this is not yet supported; - alternate materials not yet supported. Double-skinned meshes: Those will be exported to ascii file with double count of bones in the skeleton, first starting with "b_" and second starting with "bx_". In this state, merged skeleton will work incorrecty, its only done this way to make 2 sets of vertex groups, one for each skin (armature modifier). For example, human heads have 2 skins: facial and body. Another example is seagull, using one for wing deformations, and another one for main body. To make it work, delete main skeleton, import one or both separate skeletons (named as _skb.ascii & _skx.ascii) and apply them to the same mesh. Note that modifiers must be applied to work sequentially, not mixed. This way you can first apply facial impressions, and then move main body bones of a model. Checked to work in blender. If its too complicated, just apply only one skeleton whenever you need facial or body modifier.3 points- [Xbox] Conker Live and Reloaded models
I got the initial pose to show decent, still some areas where the rotation isn't exactly right, mostly the limbs,3 points- (PS3) Until Dawn Beta (SCEE London Studio ver)- Help Wanted (EyetoySDK/Heavily modified singstar engine(?))
Here you go - plugin for Blender 5.0 Imports meshes, skeletons, animations and textures Some animation files may fail to import (could not figure it out) io_scene_until_dawn_demo.zip3 points- Syberia II (PS2) - TGA / VRLE images
3 points- Disney Heroes: Battle Mode .ect2
3 pointsThank you, with this I was able to put the image ImageHeat (see first image) and export it as a .png, and after modifying the .atlas to read the .png, I was able to lead the animation in my Spine Viewer However, he looks weird, with most of the problems around the edges (like his collar or his eyes), which may have something to do with the outline that I think is in "rim-DEFAULT." However, I can't seem to figure out a way to export the texture from rim properly. kermit.zip3 points- Sébastien Loeb Rally EVO .BIN files
3 pointsPhew, first of all, i'm still impressed how Chipicao managed this Format back then, shoutout to him i've went through all games i could find that are using the "GEM Graphics Engine Milestone" and tried to restructure some of the skips and guesses in Chipicao's max script \ tried to write a newer version - failsave for each game the reason why the script does crash on sebastien loeb rally is because they rebuilt these bin files roughly 3 times, sadly there is no real identifier to tell which game the bin file belongs to gen 1 (SBK09, SBK10, Superstars V8, Superstars Next Challenge, WRC1) - which had their vertex buffer stored one by one (vert - normals - uvs - index - etc) gen 2 (SBK11, SBK Generations, MUD, MXGP 1, MotoGP13, WRC2, WRC3, WRC4, WRC Powerslide) - started to combine the vertexbuffers on stride with multiple fvfcode / types these games also came with a seperate *.RES file which sometimes stored either just strings, or packed (uncompressed) DDS textures, Chipicaos script was able to extract them so i've moved that chunk over gen 3 (MotoGP14, MotoGP15, MotoGP16(ValentinoRossi), MotoGP17, Ducati 90th Anniversary, MXGP 2, RIDE 1, RIDE 2, Sebastien Loeb Rally EVO) - dropped the .RES files, but included the stringlist to the .BIN file packed under a new header hash 9241a9d5 CLSID_DIRECTSTREAMINGOBJECT these GEM files are split into a ton of chunks, starting usually with 5b2a 5b42 5b30 - then another 2byte type - then the Hash which kind it is - i've found one MotoGP13.PDB file which named some of these hashes (yet i cant tell which algo it is using) - each game also varies between having a hash bc258a42 CLSID_NAMEDOBJECT in between blocks, it really is chaotic (yet structurized...) i havent looked much into the track files yet, if someone else wants to continue attempting this, feel free to go through this chunky and messy code 😅 there is a lot of offset jumping required - so it first starts with texture count, material count, meshcount and node/bone count - the meshchunk jumps back and reads the material block at offset x etc. - the bones offset jumps are just mental i've ignored the texture and material setup for now and focused on getting at least the meshes and bones however, this thing is so chaotic, i got lost at jumping down to the indexbuffer which then skips the unneeded vertices, thats why it will load the entire vertexbuffer per object, so as for now, use the removeunusedvertices.ms script in there 😓 the bone orientation is different to the meshes - which could be fixed in the script - or just rotate the rootbone to fit the mesh orientation - since boneweights are yet not applied aswell (loading time on these vertexbuffer is long enough already) - some of these bones or dummies are required to place the meshes in the correct position / orientation long story short, these are 24 standalone max scripts to import these files, a script to get rid of dead vertices and a color map for hexworkshop to spot these pointers have fun Milestone_Gem.7z3 points- [Xbox] Conker Live and Reloaded models
Here's a quick little texture extractor for blender import a map, or model open, or paste the script in the script editor edit the output path to where you want them to go press run script all textures currently in your scene are exported refresh the scene if you want to keep the textures tidy you will have some missing textures, because I forgot to reimplement the extra textures stored inside the texture handles, it will get reimplemented soon batch_imgextract.py3 points- [PC] [RF Online] Asset Tools for Blender (MSH, BN, ANI, Import/Export, (R3E, BSP Import-only))
3 points- 46 downloads
- Version 0.1.0
An addon for Blender 5.0.0 to import and export the .msh, .bn (.bbx goes together) and .ani files for RF Online. The entity (R3E) and map (BSP) formats are import only. Import operations work with drag and drop. There is code for exporting the BSP format inside the addon code but it is deactivated due to being incomplete. It only reaches so far as actually exporting walkable map geometry (with the BSP structure also built) and baking+exporting the light maps. Unfortunately, Blender proved to not be very suitable for the task of actually being a complete map editor for RF Online, mostly due to complexity issues with the .SPT particle format and other desirable features that would be hard to implement into it, such as mob spawn areas and portals. The R3M materials are also quite hard to simulate, since the original engine rendered the same mesh multiple times for each texture layer they had. It is possible to reactivate the feature by manually uncommenting the three commented lines in the bsp.py's menu_func_export, register and unregister functions. Expect no support for this feature, as the more proper solution would be writing a proper dedicated software. Current Features: MSH (Mesh) Import: Imports .msh static meshes (Standard and MESH08 formats). Automatically attempts to find and assign textures by looking for DDS files referenced in the mesh or by searching .RFS archives in expected relative paths (../Tex/). MSH (Mesh) Export: Exports selected Blender mesh(es) to .msh format (Standard or MESH08). Handles vertex data, UVs, weights, and bone assignments. The export ignores any collection with the name "bone shapes". Objects can have multiple materials in Blender, but only the first texture connected to the Base Color input of the BSDF Principled shader node will get its path exported. BN (Skeleton) Import: Imports .bn skeleton files. Reads bone hierarchy and rest poses. Automatically looks for the corresponding .bbx file (must be same name, same folder) to get the proper skeleton name. Creates Blender Armature objects. Also imports custom bone shape geometry if defined in the BN file and creates mesh objects for them, assigning them as custom shapes in Blender. BN (Skeleton) Export: Exports a selected Blender Armature to .bn format. Calculates and exports the corresponding .bbx file with skeleton name and bounding box. Exports custom bone shape geometry if assigned. ANI (Animation) Import: Imports .ani animation files. Applies animations to compatible Armatures and/or Objects based on names found in the ANI file. Creates Blender Actions. Option to target selected objects or objects within a collection matching the ANI's base name. ANI (Animation) Export: Exports Blender Actions to .ani format. Bakes complex animations (constraints, drivers, NLA) before export. This option currently exports ALL actions in the scene at once. Exported animations get their names from the action names inside Blender. One .ANI file is created for each action. BSP (Map) Import: Imports .bsp map geometry. Reads associated .r3m (materials), .r3t (textures), and .ebp (entities, collision) files (must be same base name, same folder). Locates entity assets by parsing .rpk archives found in ../Entity/ relative to the BSP's directory. Instantiates map geometry, materials (replicating many R3M effects), and R3E entities. Includes an option to import and display LDR lightmaps from Lgt.r3t files. There is also an option for creating a visualization of the actual BSP structure of the map by creating boxes with the nodes' dimensions and leaves with the appropriate geometry, however this will most certainly make the Blender scene run very slow (this option is not necessary to see the actual map at all if that's what you want). R3E (Entity) Import: Imports .r3e files together with their associated .r3m and .r3t files. Also imports animations, if present. Installation: Download the repository as a .zip file. Or simply download the embed file here. In Blender, go to Edit > Preferences > Add-ons. Click Install... and select the downloaded .zip file. Enable the "RF Online importer/exporter" addon by checking the box next to it. Dependencies (only necessary if you want to manually try the BSP export option) DDS Export (.bsp): Exporting BSPs requires ImageMagick to be installed and accessible in your system's PATH. The addon uses it to convert textures to DDS format. Download from: https://imagemagick.org/script/download.php Important: During installation, ensure you check the option to "Install legacy utilities (e.g., convert)" as the addon uses the magick convert command. How to Use: Import: Find the RF Online importers under File > Import > ... (MSH, BN Skeleton, ANI, BSP, R3E). Export: Find the RF Online exporters under File > Export > ... (MSH, BN Skeleton, ANI). Operator Options: Each operator has options. Pay attention to options like: MSH Export: Mesh Format to Export (Standard/MESH08), Collection Type to Export. ANI Import: Apply to Selected Objects, Ignore Not Found Objects. ANI Export: Action(s) to Export. BN Export: Export only selected. Debug options are available for troubleshooting. If turned on, open Blender's console to see the messages. Expected File Structure & Naming Conventions The addon relies on specific file names and relative folder locations to find associated assets: BSP Import (map.bsp): Needs map.r3m, map.r3t, mapLgt.r3t (optional), map.ebp in the same folder. Needs entity RPK archives (e.g., entity.rpk, monster.rpk) located in ../Entity/ relative to the map.bsp folder. The addon parses these RPKs to find the .r3e, .r3m, .r3t, etc., files for map entities. MSH Import (mesh.msh): Will look for texture paths defined within the MSH. If not found directly, it attempts to find textures in .rfs archives located in ../Tex/ relative to the .msh file's folder. BN Import (skeleton.bn): Needs skeleton.bbx in the same folder to read the proper skeleton name and overall bounding box. Export Naming:MSH Export: Selected Objects: Uses the filename you provide in the export dialog (e.g., my_export.msh). Active Collection / All Collections: Uses the collection name as the base filename in the selected directory (e.g., exporting a collection named "Props" to D:/Exports/ results in D:/Exports/Props.msh). Any collection named "bone shapes" is ignored and not exported when present. This is done to prevent the exportation of bone shapes as new .msh files. BN Export: Similar to MSH Export (uses selected armature name or collection name). Writes both .bn and .bbx files (e.g., skeleton.bn, skeleton.bbx). ANI Export: Uses the Blender Action name as the filename in the selected directory (e.g., an action named "Walk_Cycle" exports as Walk_Cycle.ani). Current Limitations / Disclaimer: BSP Export is DISABLED: While the addon includes the code for that, the operator to export a full .bsp map (including geometry, materials, entities, and baked lightmaps) is currently disabled in this release. BSP export is extremely complex, and this feature is incomplete. Performance: Importing very large maps or exporting complex scenes may take time due to Python processing. You can see the importing progress if you've opened Blender's console before importing a map. R3M Effects: While many material effects are replicated using shader nodes, perfect 1:1 visual parity with the original D3D8 fixed-function pipeline can be challenging. MSH exporter does not export effects currently. Download Link: https://github.com/Cardboard-box-a/cbb-rf-online-addon (download the repo as a zip), or the file embed here. Bug Reports/Suggestions: [The github's Issue page might be more suitable for keeping tracking of possible issues] Overall the import part of the addon expects that you are using it to import files from a real game client, with the original folder structure. Meshes, for example, can be imported without their associated textures if the original folder structure is not present. The .MSH exporter splits meshes that have more than 65k vertices automatically which has been tested by the .msh importer itself, but actual experience in the game is welcome to be known. Different materials in an object will also trigger a split. Uploaded in this post itself is a zip containing ImHex patterns for some of the file formats I've worked on. Hopefully this addon will prove useful for creating custom content for such an old game, or at least to satisfy the curiosity of what the game looks like behind the curtains. Patterns.zip3 points- [Xbox] Conker Live and Reloaded models
HAPPY NEW YEARS, and to you Uber, thanks for the script man. HAPPY HOLIDAYS!3 points- Blitz Games PS2 Bratz Textures
3 pointsThis looks correct. The palette is RGB5551, but is swizzled with the same method as the image (not the standard PS2 palette shift). Patrick should be able to confirm if that can be added to ImageHeat as a palette swizzle option.3 points- Graphics/Texture finders and viewers
3 pointsI've just released new version of ImageHeat 🙂 https://github.com/bartlomiejduda/ImageHeat/releases/tag/v0.39.1 Changelog: - Added new Nintendo Switch unswizzle modes (2_16 and 4_16) - Added support for PSP_DXT1/PSP_DXT3/PSP_DXT5/BGR5A3 pixel formats - Fixed issue with unswizzling 4-bit GameCube/WII textures - Added support for hex offsets (thanks to @MrIkso ) - Moved image rendering logic to new thread (thanks to @MrIkso ) - Added Ukrainian language (thanks to @MrIkso ) - Added support for LZ4 block decompression - Added Portuguese Brazillian language (thanks to @lobonintendista ) - Fixed ALPHA_16X decoding - Adjusted GRAY4/GRAY8 naming - Added support section in readme file3 points- Hex2Obj
3 points- 775 downloads
- Version 0.24e
The "Download this file" button links to the old version (which I can't get rid of). Download the appended zip file instead! This tool is meant to take the mesh data from the mesh you want to convert into OBJ (you have to load the model file into the program). You will also have to use a hex editor to find the model's mesh data offsets and counts and then copy them into hex2obj. Depending on these parameters it will convert the hex data into an OBJ file (File/SaveAs mesh) that you can then import into your preferred 3D Program (3DS Max, Blender, Maya, etc) hex2obj_0.25b.zip3 points - Battlefield 6 [updated] tool
Account
Navigation
Search
Configure browser push notifications
Chrome (Android)
- Tap the lock icon next to the address bar.
- Tap Permissions → Notifications.
- Adjust your preference.
Chrome (Desktop)
- Click the padlock icon in the address bar.
- Select Site settings.
- Find Notifications and adjust your preference.
Safari (iOS 16.4+)
- Ensure the site is installed via Add to Home Screen.
- Open Settings App → Notifications.
- Find your app name and adjust your preference.
Safari (macOS)
- Go to Safari → Preferences.
- Click the Websites tab.
- Select Notifications in the sidebar.
- Find this website and adjust your preference.
Edge (Android)
- Tap the lock icon next to the address bar.
- Tap Permissions.
- Find Notifications and adjust your preference.
Edge (Desktop)
- Click the padlock icon in the address bar.
- Click Permissions for this site.
- Find Notifications and adjust your preference.
Firefox (Android)
- Go to Settings → Site permissions.
- Tap Notifications.
- Find this site in the list and adjust your preference.
Firefox (Desktop)
- Open Firefox Settings.
- Search for Notifications.
- Find this site in the list and adjust your preference.