static private DollState CreateDollState(UnitEntityData unitEntityData) { var dollState = new DollState(); var dollData = unitEntityData.Descriptor.Doll; dollState.SetRace(unitEntityData.Descriptor.Progression.Race); //Race must be set before class //This is a hack to work around harmony not allowing calls to the unpatched method CharacterManager.disableEquipmentClassPatch = true; dollState.SetClass(unitEntityData.Descriptor.Progression.GetEquipmentClass()); CharacterManager.disableEquipmentClassPatch = false; dollState.SetGender(dollData.Gender); dollState.SetRacePreset(dollData.RacePreset); dollState.SetLeftHanded(dollData.LeftHanded); dollState.SetEquipColors(dollData.ClothesPrimaryIndex, dollData.ClothesSecondaryIndex); foreach (var assetID in dollData.EquipmentEntityIds) { if (head.ContainsKey(assetID)) { dollState.SetHead(head[assetID]); if (dollData.EntityRampIdices.ContainsKey(assetID)) { dollState.SetSkinColor(dollData.EntityRampIdices[assetID]); } } if (hair.ContainsKey(assetID)) { dollState.SetHair(hair[assetID]); if (dollData.EntityRampIdices.ContainsKey(assetID)) { dollState.SetHairColor(dollData.EntityRampIdices[assetID]); } } if (beard.ContainsKey(assetID)) { dollState.SetBeard(beard[assetID]); if (dollData.EntityRampIdices.ContainsKey(assetID)) { dollState.SetHairColor(dollData.EntityRampIdices[assetID]); } } if (skin.ContainsKey(assetID)) { if (dollData.EntityRampIdices.ContainsKey(assetID)) { dollState.SetSkinColor(dollData.EntityRampIdices[assetID]); } } if (horns.ContainsKey(assetID)) { dollState.SetHorn(horns[assetID]); if (dollData.EntityRampIdices.ContainsKey(assetID)) { dollState.SetHornsColor(dollData.EntityRampIdices[assetID]); } } if (skin.ContainsKey(assetID)) { if (dollData.EntityRampIdices.ContainsKey(assetID)) { dollState.SetSkinColor(dollData.EntityRampIdices[assetID]); } } if (classOutfits.ContainsKey(assetID)) { if (dollData.EntityRampIdices.ContainsKey(assetID) && dollData.EntitySecondaryRampIdices.ContainsKey(assetID)) { dollState.SetEquipColors(dollData.EntityRampIdices[assetID], dollData.EntitySecondaryRampIdices[assetID]); } } } dollState.Validate(); return(dollState); }