In Heroes, the model file structure looks like this
There's a Model file, sometimes it comes without a label, and inside it there are references 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 referencing the skeleton and the model
For models from the original game, these may be written directly into the Model file itself
Take the Psathi 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 recorded
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's 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 start, you need to practice on models with ready-made effects, for example the Revengers have a helmet attached, a shield, left and right pauldrons, and a sword
The effect file contains a reference 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 the Psathi 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, and 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 the animset line and select the ellipsis, then do the same to open the desired animation (idle), then the effect and the required ModelInstance. In it, you need to change the position, rotation, and scale parameters until the model sits properly.