You use "bool ChangeCrType(uint newType);" engine Critter method function for that. Normally SDK holds something like "Base" critter type inside some stat, normally it is ST_BASE_CRTYPE, then to use this critter type value to restore "nude" skin of critters that take off their armors etc.
If you still don't quite understand, critter type is a structure that contains lots of data, such as animations indices allowing, run/walk time, and most importantly the actual animation BASE name ( which is technically a part of skin graphics file name). It is hooked up in plain non-negative number, you can check them in your CritterTypes.cfg file, normally its located in server/data folder, normally this file should be self-explanatory what is inside for you to get used to it. So when you want to change the critter type you logically feed the desired critter type ID ( the number its declared with ). Directly you can do it with plain number, i.e if your critter type is marked with 13 ID, you just call it with critter.ChangeCrType(13), normally people define those IDs as some verbose and easy to understand constants, then to make it easier to read and refer to in future.
At which point of execution to do this is up to you, but NORMALLY such things done via critter_init server engine callback, that allows globally handle all newly generated critters, players included. And if you do it in there, you probably want it to be executed only when firstTime is true.
Example
if(firstTime)
{
// INITIALIZE PARAMS
if(cr.IsPlayer())
{
cr.StatBase[ST_BASE_CRTYPE] = (cr.Stat[ST_GENDER] == GENDER_MALE ? CRTYPE_MALE_DEFAULT : CRTYPE_FEMALE_DEFAULT); // set our base critter type (presumably forever)
cr.ChangeCrType(cr.StatBase[ST_BASE_CRTYPE]); // apply it;
}
}
If you want to change only the visual representation of a critter without changing it critter type, you might want to teach engine/rename graphic files ( why though ).