in Heroes the model file structure looks like this
there is a Model file, sometimes it comes without a label, inside it there are links to files
Material
Skeleton
Geometry
the first file leads to a Texture file, which in turn leads to a dds file with the actual texture – you can open it and recolor it
Skeleton and Geometry contain model data, namely codes that reference the skeleton and the model
for models from the original game they may be written directly into the Model file itself
take Psatkha's mod and try to find such a file there
you can even reference files from the original game like the Revenger does
model file
<?xml version="1.0" encoding="UTF-8"?>
<Model>
<Materials>
<Item href="Revenger.(Material).xdb#xpointer(/Material)"/>
</Materials>
<Skeleton href="/Characters/Creatures/Necropolis/AlternativeUpgrade/SkeletonWarrior-skel.xdb#xpointer(/Skeleton)"/>
<Geometry href="/Characters/Creatures/Necropolis/AlternativeUpgrade/SkeletonWarrior-geom.xdb#xpointer(/Geometry)"/>
<Animations/>
<WindPower>1</WindPower>
</Model>
now about animation
the AnimSet file
inside this file paths to files responsible for different animations are written
animsets
<AnimSet>
<animations>
<Item>
<Kind>attack00</Kind>
<Anim href="Revenger-arena-attack00.xdb#xpointer(/BasicSkelAnim)"/>
</Item>
<Item>
<Kind>happy</Kind>
<Anim href="Revenger-arena-happy.xdb#xpointer(/BasicSkelAnim)"/>
</Item>
<Item>
<Kind>hit</Kind>
<Anim href="Revenger-arena-hit.xdb#xpointer(/BasicSkelAnim)"/>
</Item>
<Item>
<Kind>idle00</Kind>
<Anim href="Revenger-arena-idle00.xdb#xpointer(/BasicSkelAnim)"/>
</Item>
<Item>
<Kind>move</Kind>
<Anim href="Revenger-arena-move.xdb#xpointer(/BasicSkelAnim)"/>
</Item>
<Item>
<Kind>stir00</Kind>
<Anim href="Revenger-arena-stir00.xdb#xpointer(/BasicSkelAnim)"/>
</Item>
<Item>
<Kind>stir01</Kind>
<Anim href="Revenger-arena-stir01.xdb#xpointer(/BasicSkelAnim)"/>
</Item>
</animations>
<ExpSrcScene/>
<ExpSrcClipFolder/>
<ExpRootTransform/>
</AnimSet>
inside each animation there is also a numeric code responsible for it, a path to the sound file, and a path to the EFFECT file
individual animation
<?xml version="1.0" encoding="UTF-8"?>
<BasicSkelAnim>
<SrcName href="/H5A2/Creatures/AlternativeUpgrades/Necropolis/T1_SkeletonWarrior/SkeletonWarrior.mb"/>
<uid>0C9C5A1E-FC1C-4F9A-A2D5-F5E7C2649C9F</uid>
<ExpSrcClip href="/H5A2/Creatures/AlternativeUpgrades/Necropolis/T1_SkeletonWarrior/Animations/Clip/SkeletonWarrior.idle00.ma"/>
<ExpRootTransform>Global</ExpRootTransform>
<ExpFrameFirst>0</ExpFrameFirst>
<ExpFrameLast>0</ExpFrameLast>
<ExpSettingsFile href=""/>
<MovementSpeed>0</MovementSpeed>
<SpeedFactor>1</SpeedFactor>
<Sound href="/Sounds/_(Sound)/Creatures/Necropolis/T1/idle00.xdb#xpointer(/Sound)"/>
<Effect href="/Effects/_(Effect)/Characters/Creatures/Neutral/H5A0/Revenger/idle.(Effect).xdb#xpointer(/Effect)"/>
<SpeedLineFallTime>250</SpeedLineFallTime>
<SpeedLineMaterial/>
</BasicSkelAnim>
to begin with, you should practice on models that already have effects attached, for example the Revengers have a helmet, shield, left and right shoulder pads, and a sword attached
the effect file contains a link to each attached model, more precisely to a ModelInstance file
effect
<?xml version="1.0" encoding="UTF-8"?>
<Effect>
<Instances/>
<Lights/>
<Models>
<Item href="Revenger_helmet.(ModelInstance).xdb#xpointer(/ModelInstance)"/>
<Item href="Revenger_LC.(ModelInstance).xdb#xpointer(/ModelInstance)"/>
<Item href="Revenger_RC.(ModelInstance).xdb#xpointer(/ModelInstance)"/>
<Item href="Revenger_sword.(ModelInstance).xdb#xpointer(/ModelInstance)"/>
<Item href="Revenger_shield.(ModelInstance).xdb#xpointer(/ModelInstance)"/>
</Models>
<WindAffected>false</WindAffected>
<WindPower>1</WindPower>
<Duration>2.5</Duration>
</Effect>
now about ModelInstance
these files contain the path to the attached model, its position along xyz, rotation around those same axes, scaling, and bone attachment
modelinstance
<?xml version="1.0" encoding="UTF-8"?>
<ModelInstance>
<Model href="Revenger_helmet.(Model).xdb#xpointer(/Model)"/>
<SkelAnim/>
<Position>
<x>0</x>
<y>0</y>
<z>0.2</z>
</Position>
<Rotation>
<x>0</x>
<y>0</y>
<z>0</z>
<w>1</w>
</Rotation>
<Scale>1</Scale>
<Offset>0</Offset>
<CycleLength>0</CycleLength>
<CycleCount>0</CycleCount>
<GlueToBone>1</GlueToBone>
<GlueToNamedBone>Head</GlueToNamedBone>
</ModelInstance>
effects need to be edited through the map editor, when you launch it the map properties window will pop up automatically, place Psatkha's creature on the map, select it, and then the map properties window will turn into an object properties window, find the line with the path to the mapobject file, click on the path, a button with an ellipsis and a new button will appear – click the ellipsis
a window with paths to the model and animset files will open, you also need to click on the animset line and choose the ellipsis, then open the desired animation (idle) the same way, then the effect and the needed ModelInstance, in which you need to change the position, rotation, and scale parameters until the model sits properly
Honestly, this or something similar should be saved somewhere prominent, everything is described in great detail and could be useful for beginners.