I'm just going to post about this because it's a pretty common question and I figured it may be worth covering how to work with the natives that effect character appearances. As well as how to apply those specific values.
Loading Freemode Models Client Side
There are two types of models that you should load on connection complete. Here is the code that I use on client-side to simply load these models.
Adjusting Server Side Player Model
After loading these models you need to set the player model on server-side to either one of these specific models.
This can be done by adjusting the Player's model property.
Adjusting Face Features Client Side
Face Values
The face values can only be set when you set all pedHeadBlendData to zero first. After setting the headBlendData to zero you can apply different face combinations.
After setting this value you can then apply a mixture of faces to obtain the face you want in-game. Valid face and skin values range from 0-45. While the blend data is -1 to 1.
Here's a list of all the arguments for the above function in order.
Hairstyles, Colors, etc.
Hair is a combination of a head overlay or a tattoo and multiple natives.
Here's a list of all head overlays / tattoos for player hair styles.
Here is an additional list where I physically named all of the hairstyles and color names but they are not correct by any means.
Apply Hair Styles
You can apply hairstyles by using setPedComponentVariation.
native.setPedComponentVariation(scriptIDOfPed, 2, hairIndex, hairTexture, 0);
Applying Hair Color
Hair color has its very own native. Which can be accessed with setPedHairColor.
I recommend colors 0-63.
native.setPedHairColor(scriptIDOfPed, color1, color2);
Applying Hair Overlay for Proper Skin Under Hair
One thing a lot of server owners often overlook in their code is the head overlays for tattoos and such. It's very important that you apply these as they'll give hair the look it deserves.
Please note that you must use getHashKey on both collection and overlay strings.
native.addPedDecorationFromHashes(pedOrPlayer, collection, overlay);
Eyes
Eyes are actually really easy to adjust. It actually has its very own natived.
native.setPedEyeColor(pedOrPlayer, colorIndex);
Face Structure
Structure has to do with applying slight tweaks to the player's overall face appearance. For example if you want a slightly turned up nose this is where you would adjust that.
Here's a list of Face Structures with IDs
What I do is keep all of the values in an array when it's ready to be applied. Here's an example of how to use the Face Feature native to apply changes.
native.setPedFaceFeature(pedOrPlayer, structure.id, structure.value);
It's pretty simple. Make sure to keep your values between -1 and 1. Anything below or above those values will result in non-synced player changes.
Makeup, Facial Hair, etc.
These can all be done through setPedHeadOverlay. This specific native will let you apply various features from makeup, facial hair, blemishes, etc.
Here's a full list of overlays with their minimum and maximum values.
These can be applied with the following native:
native.setPedHeadOverlay(pedOrPlayer, overlayID, overlayIndex, opacity);
native.setPedHeadOverlayColor(pedOrPlayer, overlayID, 2, color1, color2);
Tattoos
Tattoos are the final bit of information for character editing. These are done similar to the hair overlays. I recommend applying tattoos last. All collection and overlay names must use getHashKey to be applied correctly.
native.addPedDecorationFromHashes(pedOrPlayer, collection, overlay);
Here's a list of all tattoos