public Vector3 WestOffset(ExtraApparelPartProps Entry)
 {
     if (Entry.WestOffset != Vector3.zero)
     {
         return(Entry.WestOffset + this.Props.WestOffset);
     }
     return(this.Props.WestOffset);
 }
        public Vector3 GetOffset(Rot4 rotation, ExtraApparelPartProps partEntry)
        {
            Vector3 offset = new Vector3();

            if (!partEntry.hidesBody)
            {
                offset.y = _OffsetFactor * partEntry.order;
                offset.y = offset.y + (_SubOffsetFactor * partEntry.sublayer);
            }

            if (!onHead || !Props.onHead || !ExtraPartEntry.OnHead)
            {
                offset.y += _BodyOffset;
                if (rotation == Rot4.North)
                {
                    if (partEntry.northtop)
                    {
                        offset.y += _HairOffset;
                        offset   += NorthOffset(partEntry);
                    }
                    else
                    {
                        offset += NorthOffset(partEntry);
                    }
                }
                else if (rotation == Rot4.West)
                {
                    offset += WestOffset(partEntry);
                }
                else if (rotation == Rot4.East)
                {
                    offset += EastOffset(partEntry);
                }
                else if (rotation == Rot4.South)
                {
                    offset += SouthOffset(partEntry);
                }
            }
            else
            {
                if (rotation == Rot4.North)
                {
                    offset.y += _BodyOffset;
                }
                else
                {
                    offset.y += _HeadOffset;
                }
            }

            if (partEntry.animateExtra)
            {
                offset = AnimateExtraBit(offset);
            }
            return(offset);
        }
        public void GeneratePart()
        {
            StringBuilder msg = new StringBuilder();

            if (extraPartEntryint >= 0)
            {
                extraPartEntry = this.Props.ExtrasEntries[extraPartEntryint];
            }
            else
            {
                List <ExtraApparelPartProps> possibles = new List <ExtraApparelPartProps>();
                if (extraPartEntryint == -1)
                {
                    if (Apparel.TryGetQuality(out QualityCategory quality))
                    {
                        msg.AppendLine("            QualityCategory: " + quality);
                        possibles.AddRange(this.Props.ExtrasEntries.FindAll(x => x.AcceptableForQuality(quality)));
                    }
                    else
                    {
                        msg.AppendLine("            No CompQuality");
                        possibles = this.Props.ExtrasEntries;
                    }
                }
                msg.AppendLine("            possibles: " + possibles.Count);
                if (!possibles.NullOrEmpty())
                {
                    Rand.PushState();
                    extraPartEntry = possibles.RandomElementByWeight((ExtraApparelPartProps x) => x.commonality);
                    Rand.PopState();
                    extraPartEntryint = this.Props.ExtrasEntries.IndexOf(extraPartEntry);
                }
                else
                {
                    extraPartEntryint = -2;
                }
            }
            if (extraPartEntry != null)
            {
                this.shader              = ShaderDatabase.LoadShader(extraPartEntry.graphicData.shaderType.shaderPath);
                this.useSecondaryColor   = extraPartEntry.useParentSecondaryColor;
                this.ExtraUseBodyTexture = extraPartEntry.UseBodytypeTextures;
                msg.AppendLine("    Using: " + extraPartEntry + " at position: " + extraPartEntryint);
                msg.AppendLine("        shader: " + shader + " useSecondaryColor: " + useSecondaryColor + " ExtraUseBodyTexture: " + ExtraUseBodyTexture);
                partInitialized = true;
            }
            else
            {
                extraPartEntryint = -2;
            }
        }