Skip to content
View in the app

A better way to browse. Learn more.

ResHax

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
Help us keep the site running.

NHL 21 .mcd models (PS4)

Featured Replies

Does anyone know more about the mcd format used by EA? Models are packed inside the rsf format and it is possible to extract them with the rsf.bms script. I managed to make a Noesis script to view the models, but reading the skeletons is hard for me and I don't know how to proceed with them. Vertex weights are stored in a table that starts with the tag TIEW in mcd and skeleton data in FRGS in .skel file. I would appreciate any kind of help to import the skeletons into noesis. 

Preview in Noesis:

https://imgur.com/a/o2dQvCl

fmt_NHL21_mcd.py rsf.bms.zip nhl21model.zip

Solved by Durik256

  • Supporter
3 hours ago, Beedy said:

skeletons into noesis. 

I researched the *skel file structure and made a plugin.

*(keep reading nodes recursively (using the number of children value) until they run out)

structure:

Spoiler
RSF/00, 0, 48, 0 
FRGS, 0, chunkSize, chunkDataofs


UINT lenLabel
BYTE[lenLabel+1] label + /0
UINT unk(4)
UINT lenName
BYTE[lenName] name
BYTE[6] unks (0, 0, 0, 16, 0, 0/1-flag_have_item) 

if have_item:
    UINT unk(2)
    UINT numItem
    for x in range(numItem):
        UINT unk(30259)
        UINT unk(1)
        UINT lenLabel
        BYTE[lenLabel+1] label + /0
        VEC3(3_float) item (translate or rotate or scale)

UINT unk(2)
BYTE unk(1)
if SGNodeGroup:
    pass

if SGNodeLocator:
    UINT unk(1)
    VEC3(3_float) unk
    
if SGNodeTransform:
    UINT unk(1)
    MAT4(16_float) local_mat
    
if SGNodeJoint:
    UINT unk(1)
    MAT4(16_float) local_mat
    UINT unk(2)
    MAT4(16_float) unk_mat
    MAT4(16_float) world_mat
    MAT4(16_float) unk_mat
    UINT unk(0)
    
UINT numChild

 

I quickly looked at the TIEW chunk, it seems to have this structure:

BYTE[4] label(TIEW)
UINT unk(2)
UINT chunkSize
UINT dataOfs
UINT numBLock?

for x in range(numBLock):
	UINT index
	UINT bonePerVert
	UINT numElem
	float[numElem*bonePerVert] weights
	ushort[numElem*bonePerVert] bone_indices

 

Без имени-1.png

Edited by Durik256

  • Author

Thank you! this helps me a lot. 🙂

  • Supporter
  • Solution
28 minutes ago, Beedy said:

Thank you! this helps me a lot. 🙂

also for weights to work correctly, as bones you need to use only "SGNodeJoint"

I didn’t try to understand your code, I just integrated my code into your plugin.

I also added the 'readSkel' flag to the mesh plugin. if it is 'True' then it will find the first *skel in the mesh folder and download it.

I also added the readMesh flag to the skeleton plugin. if it is "True" then it will find all *mcd's in the skeleton folder and load them.

*(do not combine both of these methods)

your plugin (added weights and skeleton loading (optional): fmt_NHL21_mcd.py

my skeleton plugin: fmt_skel_nhl21.py

bandicam 2024-08-05 18-39-05-409.gif

  • Author

Awesome! Many thanks for this! 🙏

Create an account or sign in to comment

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.