using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; using RimWorld; using rjw; using Verse; namespace SizedApparel { [StaticConstructorOnStartup] public class ApparelRecorderComp : ThingComp { public bool isDrawAge = true; public bool testbool = false; public ApparelRecorderCompProperties Props => (ApparelRecorderCompProperties)this.props; public bool hasUpdateBefore = false; public bool hasUpdateBeforeSuccess = false; public bool hasGraphicUpdatedBefore = false; // not yet public bool needToCheckApparelGraphicRecords = false; public bool isDirty = true; public bool hasUnsupportedApparel = true; public bool havingSex = false;//Obsolete public bool hasUpdateForSex = false;//Obsolete public List cachedApparelGraphicRecord = new List(); public Hediff breastHediff = null; //TODO: Make this as List public Hediff vaginaHediff = null; public List penisHediffs = null; // RJW can attach multiple penis public Hediff anusHediff = null; public Hediff udderHediff = null;//RJW 4.6.8: Udder is not partof chest's breast. it attached to torso. public float breastSeverity = -1; public float breastSeverityCapToDraw = 1000; public float BreastSeverityCache = 0; //public float BiggestBreastSeverityInAvailableTextures = 0; //for breasts animation or something. public Vector3? prePositionCache; public float? preAngleCache; public int? preTickCache; public SizedApparelBodyPart bodyPartBreasts;//TODO: Make this as List public SizedApparelBodyPart bodyPartNipple;//TODO public List bodyPartPenises = new List(); public List bodyPartBalls = new List(); public SizedApparelBodyPart bodyPartVagina; public SizedApparelBodyPart bodyPartAnus; public SizedApparelBodyPart bodyPartBelly; public SizedApparelBodyPart bodyPartMuscleOverlay;//TODO public SizedApparelBodyPart bodyPartUdder; public SizedApparelBodyPart bodyPartPubicHair; //TODO public SizedApparelBodyPart bodyPartHips; public List bodyPartThighs = new List(); public List bodyPartHands = new List(); public List bodyPartFeet = new List(); public Graphic graphicSourceNaked = null; //original Graphic public Graphic graphicSourceRotten = null; //original Graphic public Graphic graphicbaseBodyNaked = null; public Graphic graphicbaseBodyRotten = null; [Obsolete] public Graphic graphicBreasts = null; [Obsolete] public Graphic graphicBreasts_horny = null; [Obsolete] public Graphic graphicVagina = null; [Obsolete] public Graphic graphicVagina_horny = null; [Obsolete] public Graphic graphicAnus = null; [Obsolete] public Graphic graphicAnus_horny = null; [Obsolete] public List graphicPenises = new List(); [Obsolete] public List graphicBallsOfPenises = new List(); [Obsolete] public Graphic graphicBelly = null; [Obsolete] public Graphic graphicUdder = null; //RJW 4.6.8: Udder is not partof chest's breast. it attached to torso. [Obsolete] public Graphic graphicUdder_horny = null; [Obsolete] public List graphicPenises_horny = new List(); [Obsolete] public List graphicBalls_horny = new List();//Does it need? //size uncapped breasts graphics. [Obsolete] public Graphic graphicBreastsNude = null; [Obsolete] public Graphic graphicBreastsNude_horny = null; private bool drawingBreastsAddon = false; public AlienRaceSetting raceSetting = new AlienRaceSetting(); public string customPose = null; public SizedApparelPose currentCustomPose = null; public bool forceHorny = false; public bool canDrawBreasts = false; public bool canDrawPenis = false; public bool canDrawVaginaAndAnus = false; public bool canDrawTorsoParts = false; //belly and udder public override void Initialize(CompProperties props) { base.Initialize(props); Pawn p = parent as Pawn; bodyPartBreasts = new SizedApparelBodyPart(p, "Breasts", SizedApparelBodyPartOf.Breasts, "Breasts", true, false); bodyPartBreasts.SetDepthOffsets(0.0113f, 0.001f, 0.0113f, 0.0113f); bodyPartNipple = new SizedApparelBodyPart(p, "Nippple", SizedApparelBodyPartOf.Breasts, "Breasts", true, false); bodyPartBreasts.SetDepthOffsets(0.0114f, 0.000f, 0.0114f, 0.0114f); bodyPartUdder = new SizedApparelBodyPart(p, "Udder", SizedApparelBodyPartOf.Udder, "UdderBreasts", true, false); bodyPartUdder.SetDepthOffsets(0.0112f, 0.0005f, 0.0112f, 0.0112f); //UdderNipple...? //bodyPartUdder = new SizedApparelBodyPart(p, "Udder", SizedApparelBodyPartOf.Udder, "UdderBreasts", true, false); //bodyPartUdder.SetDepthOffsets(0.0112f, 0.0005f, 0.0112f, 0.0112f); bodyPartVagina = new SizedApparelBodyPart(p, "Vagina", SizedApparelBodyPartOf.Vagina, "Vagina", false, false); bodyPartVagina.SetDepthOffsets(0.0088f, 0.0100f, 0.0088f, 0.0088f); bodyPartAnus = new SizedApparelBodyPart(p, "Anus", SizedApparelBodyPartOf.Anus, "Anus", false, false); bodyPartAnus.SetDepthOffsets(0.0093f, 0.0105f, 0.0093f, 0.0093f); bodyPartBelly = new SizedApparelBodyPart(p, "Belly", SizedApparelBodyPartOf.Belly, "BellyBulge", false, false); bodyPartBelly.SetDepthOffsets(0.0098f, 0.0002f, 0.0098f, 0.0098f); } public override void PostExposeData() { base.PostExposeData(); Scribe_Values.Look(ref customPose, "customPose"); // save pawn's custom pose //Scribe_Values.Look<>(); //TODO: save pubic hair data } /* public override void CompTick() { base.CompTick(); } public override void CompTickRare() { base.CompTickRare(); }*/ string[] testPose = { null, "JiggleUp", "JiggleCenter" }; string[] testPose2 = { null, "PenisDown" }; public void DrawUpdate(Vector3 rootLoc, float angle) // call this in DrawPawnBody { //int IdTick = parent.thingIDNumber * 20; //hint from yayo animation mod if (SizedApparelSettings.autoJiggleBreasts) { Vector3 velocity; if (this.prePositionCache != null) velocity = this.prePositionCache.Value - rootLoc; else velocity = Vector3.zero; float rotation; if (this.preAngleCache != null) rotation = this.preAngleCache.Value - angle; else rotation = 0; int tick; if (this.preTickCache != null) tick = Find.TickManager.TicksGame - this.preTickCache.Value; else tick = 1; this.prePositionCache = rootLoc; this.preAngleCache = angle; this.preTickCache = Find.TickManager.TicksGame; } SetPoseFromPoseSet(testPose2.RandomElement()); } public bool isApparelGraphicRecordChanged() { Pawn pawn = parent as Pawn; if (pawn == null) return false; var apparelGraphics = pawn.Drawer?.renderer?.graphics?.apparelGraphics; if (apparelGraphics == null) return false; //return false; //since 1.3 broken. force to return false; if (!apparelGraphics.SequenceEqual(cachedApparelGraphicRecord)) { if (SizedApparelSettings.Debug) Log.Message("[SizedApparel]:" + pawn + "'s apparel Record Changed! need to updating comp"); return true; } return false; } //not working public override void PostPostMake() { /* Pawn pawn; try { pawn = (Pawn)parent; if (pawn != null) { if (!pawn.RaceProps.Humanlike) return; pawn.Drawer.renderer.graphics.ResolveAllGraphics(); if (SizedApparelSettings.Debug) Log.Message("[SizedApparels] Component Inint And Resolve all Graphics for "+ pawn.Name); } } catch { } */ } public void ClearHediffs() { breastHediff = null; vaginaHediff = null; if(penisHediffs != null) penisHediffs.Clear(); anusHediff = null; udderHediff = null; } public void ClearBreastCacheValue() { breastHediff = null; breastSeverity = -1; breastSeverityCapToDraw = 1000; BreastSeverityCache = 0; } public void ClearPenisCacheValue() { //TODO } public void ClearCanDraw() { canDrawBreasts = false; canDrawPenis = false; canDrawTorsoParts = false; canDrawVaginaAndAnus = false; } public void ClearGraphics(bool clearBreasts = true) { hasGraphicUpdatedBefore = false; graphicbaseBodyNaked = null; graphicbaseBodyRotten = null; //Clear BodyParts if(clearBreasts) bodyPartBreasts.Clear(); bodyPartAnus.Clear(); bodyPartBelly.Clear(); bodyPartVagina.Clear(); graphicBreasts = null; graphicVagina = null; graphicAnus = null; if (graphicPenises == null) graphicPenises = new List(); else graphicPenises.Clear(); if (graphicBallsOfPenises == null) graphicBallsOfPenises = new List(); else graphicBallsOfPenises.Clear(); graphicBelly = null; graphicUdder = null; graphicUdder_horny = null; graphicBreasts_horny = null; graphicVagina_horny = null; graphicAnus_horny = null; if (graphicPenises_horny == null) graphicPenises_horny = new List(); else graphicPenises_horny.Clear(); if (graphicBalls_horny == null) graphicBalls_horny = new List(); else graphicBalls_horny.Clear(); } public void ClearAll(bool clearGraphics = true) { ClearBreastCacheValue(); if(clearGraphics) ClearGraphics(); ClearHediffs(); ClearCanDraw(); hasUnsupportedApparel = false; hasUpdateBefore = false; hasUpdateBeforeSuccess = false; needToCheckApparelGraphicRecords = false; } public void SetDirty(bool clearPawnGraphicSet = false) { this.isDirty = true; if (clearPawnGraphicSet) { Pawn pawn = parent as Pawn; if (pawn == null) return; if (pawn.Drawer == null) return; if (pawn.Drawer.renderer == null) return; pawn.Drawer.renderer.graphics.ClearCache(); } } public void UpdateIfDirty() { } public void UpdateBodyGraphics() { } public void UpdateSettingData() { Pawn pawn = parent as Pawn; if (pawn == null) return; var loc_raceSetting = SizedApparelSettings.alienRaceSettings.FirstOrDefault((AlienRaceSetting s) => s.raceName == pawn.def.defName); if (raceSetting == null) return; raceSetting = loc_raceSetting; } public void CheckAgeChanged() { Pawn pawn = parent as Pawn; if (pawn == null) return; if (pawn.ageTracker == null) return; //TODO. Cleanup UpdateSettingData(); if (raceSetting == null) return; if (raceSetting.drawMinAge < 0 || pawn.ageTracker.AgeBiologicalYearsFloat >= raceSetting.drawMinAge) isDrawAge = true; else isDrawAge = false; } public void Update(bool cache = true, bool fromGraphicRecord = true, bool updateGraphics = true, bool CheckApparel = true) { isDirty = false; bool flag = fromGraphicRecord; needToCheckApparelGraphicRecords = false; //flag = false; //TODO:fromGraphicRecord is forced not to do for a while. it will update later hasUpdateBefore = true; Pawn pawn = parent as Pawn; if (pawn == null) return; if (SizedApparelSettings.Debug) Log.Message("[SizedApparel] Updating Component of " + pawn.Name); if (updateGraphics) { ClearGraphics(); ClearHediffs(); } CheckAgeChanged(); SizedApparelUtility.GetBreastSeverity(pawn, out breastSeverity, out breastHediff); if (breastHediff != null) { BreastSeverityCache = 1000; if (CheckApparel) hasUnsupportedApparel = SizedApparelUtility.hasUnSupportedApparelFromWornData(pawn, breastSeverity, breastHediff, true, flag); else hasUnsupportedApparel = false; //float validBreastTextureSeverity = SizedApparelUtility.GetBreastSeverityValidTextures(pawn, breastHediff); if (hasUnsupportedApparel) BreastSeverityCache = breastSeverity; //float validBreastTextureSeverity = SizedApparelUtility.GetBreastSeverityValidTextures(pawn, breastHediff); //breast cache forApparel brests Check. This ignore variation! //SizedApparelMod.CheckAndLoadAlienRaces(); var key = new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, pawn.story?.bodyType?.defName, breastHediff.def.defName, "Breasts", pawn.gender ,SizedApparelUtility.BreastSeverityInt(breastHediff.Severity)); var raceSetting = SizedApparelSettings.alienRaceSettings.FirstOrDefault((AlienRaceSetting s) => s.raceName == key.raceName); float validBreastTextureSeverity = SizedApparelUtility.BreastSizeIndexToSeverity(SizedApparelsDatabase.GetSupportedBodyPartPath(key,true,"Breasts","Breasts").size); //if (validBreastTextureSeverity < -5 && SizedApparelSettings.alienRaceSettings.settings[key.raceName].asHumanlike)//old: SizedApparelSettings.UnsupportedRaceToUseHumanlike // validBreastTextureSeverity = SizedApparelUtility.GetBreastSeverityValidTextures(pawn, breastHediff, "Humanlike"); BreastSeverityCache = Math.Min(BreastSeverityCache, validBreastTextureSeverity); if (SizedApparelSettings.Debug) Log.Message("[Sized Apparel] cached Severity : " + BreastSeverityCache); } //penisHediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn)).FirstOrDefault((Hediff h) => h.def.defName.ToLower().Contains("penis")); //since rjw race support's part name are too variation, not handling it. BodyPartRecord genitalPart = Genital_Helper.get_genitalsBPR(pawn); if (genitalPart != null) { var genitalList = Genital_Helper.get_PartsHediffList(pawn, genitalPart); if (!genitalList.NullOrEmpty()) { if (SizedApparelSettings.Debug) { foreach (var g in genitalList) { Log.Message(" [SizedApparel] "+ pawn.Name + "has hediff in genital (" + g.def.defName + ")"); } } //penisHediffs = genitalList.FindAll((Hediff h) => SizedApparelUtility.isPenis(h.def.defName)); penisHediffs = genitalList.FindAll((Hediff h) => Genital_Helper.is_penis(h)); //vaginaHediff = genitalList.FirstOrDefault((Hediff h) => SizedApparelUtility.isVagina(h.def.defName)); vaginaHediff = genitalList.FirstOrDefault((Hediff h) => Genital_Helper.is_vagina(h)); } } var anusList = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)); if(!anusList.NullOrEmpty()) anusHediff = anusList.FirstOrDefault((Hediff h) => h.def.defName.ToLower().Contains("anus")); //udderHediff = Genital_Helper.get_PartsHediffList(pawn, pawn.RaceProps.body.AllParts.Find((BodyPartRecord bpr) => bpr.def.defName == "Torso")).FirstOrDefault((Hediff h) => h.def.defName.ToLower().Contains("anus")); //not yet supported udderHediff = pawn.health?.hediffSet?.hediffs?.FirstOrDefault((Hediff h) => h.def.defName.ToLower().Contains("udder")); var pawnRenderer = pawn.Drawer?.renderer?.graphics; if (updateGraphics) { string baseBodyString = "_BaseBody"; string baseBodyStringWithSex; if (SizedApparelSettings.useGenderSpecificTexture) { if (pawn.gender == Gender.Female) { baseBodyStringWithSex = baseBodyString + "F"; } else if (pawn.gender == Gender.Male) { baseBodyStringWithSex = baseBodyString + "M"; } else { baseBodyStringWithSex = baseBodyString; // + "N" //Does it need to add N? } } else baseBodyStringWithSex = baseBodyString; if (pawnRenderer != null) { //pawnRenderer.ResolveAllGraphics(); //TODO. Move BodyTextureSearch to utility string nakedGraphicPath = null; if (pawnRenderer.nakedGraphic != null) { //path = path.Insert(Math.Max(path.LastIndexOf('/'), 0), "/CustomPose/"+ customPose); if(graphicSourceNaked == null) graphicSourceNaked = pawnRenderer.nakedGraphic; nakedGraphicPath = graphicSourceNaked.path; if (customPose != null) nakedGraphicPath = nakedGraphicPath.Insert(Math.Max(nakedGraphicPath.LastIndexOf('/'), 0), "/CustomPose/" + customPose); if (!nakedGraphicPath.Contains(baseBodyString)) { if (graphicbaseBodyNaked == null) { if (ContentFinder.Get((nakedGraphicPath + baseBodyStringWithSex + "_south"), false) != null) { //graphicSourceNaked = pawnRenderer.nakedGraphic; Shader shader = pawnRenderer.nakedGraphic.Shader; //if (!ShaderUtility.SupportsMaskTex(shader)) // shader = ShaderDatabase.CutoutSkinOverlay; graphicbaseBodyNaked = GraphicDatabase.Get(nakedGraphicPath + baseBodyStringWithSex, shader, pawnRenderer.nakedGraphic.drawSize, pawnRenderer.nakedGraphic.color, pawnRenderer.nakedGraphic.colorTwo, pawnRenderer.nakedGraphic.data); //pawnRenderer.nakedGraphic = graphicbaseBodyNaked; } else if (customPose != null) { nakedGraphicPath = pawnRenderer.nakedGraphic.path; if (ContentFinder.Get((nakedGraphicPath + baseBodyStringWithSex + "_south"), false) != null) { //graphicSourceNaked = pawnRenderer.nakedGraphic; Shader shader = pawnRenderer.nakedGraphic.Shader; //if (!ShaderUtility.SupportsMaskTex(shader)) // shader = ShaderDatabase.CutoutSkinOverlay; graphicbaseBodyNaked = GraphicDatabase.Get(nakedGraphicPath + baseBodyStringWithSex, shader, pawnRenderer.nakedGraphic.drawSize, pawnRenderer.nakedGraphic.color, pawnRenderer.nakedGraphic.colorTwo, pawnRenderer.nakedGraphic.data); //pawnRenderer.nakedGraphic = graphicbaseBodyNaked; } else { if (SizedApparelSettings.Debug) Log.Warning("[SizedApparel] Missing BaseBodyTexture for naked Graphic: " + nakedGraphicPath + baseBodyStringWithSex + "_south"); } } } if (graphicbaseBodyNaked == null) { if (ContentFinder.Get((nakedGraphicPath + baseBodyString + "_south"), false) != null) { // graphicSourceNaked = pawnRenderer.nakedGraphic; Shader shader = pawnRenderer.nakedGraphic.Shader; //if (!ShaderUtility.SupportsMaskTex(shader)) // shader = ShaderDatabase.CutoutSkinOverlay; graphicbaseBodyNaked = GraphicDatabase.Get(nakedGraphicPath + baseBodyString, shader, pawnRenderer.nakedGraphic.drawSize, pawnRenderer.nakedGraphic.color, pawnRenderer.nakedGraphic.colorTwo, pawnRenderer.nakedGraphic.data); //pawnRenderer.nakedGraphic = graphicbaseBodyNaked; } else if (customPose != null) { nakedGraphicPath = pawnRenderer.nakedGraphic.path; if (ContentFinder.Get((nakedGraphicPath + baseBodyString + "_south"), false) != null) { //graphicSourceNaked = pawnRenderer.nakedGraphic; Shader shader = pawnRenderer.nakedGraphic.Shader; //if (!ShaderUtility.SupportsMaskTex(shader)) // shader = ShaderDatabase.CutoutSkinOverlay; graphicbaseBodyNaked = GraphicDatabase.Get(nakedGraphicPath + baseBodyString, shader, pawnRenderer.nakedGraphic.drawSize, pawnRenderer.nakedGraphic.color, pawnRenderer.nakedGraphic.colorTwo, pawnRenderer.nakedGraphic.data); //pawnRenderer.nakedGraphic = graphicbaseBodyNaked; } else { if (SizedApparelSettings.Debug) Log.Warning("[SizedApparel] Missing BaseBodyTexture for naked Graphic: " + nakedGraphicPath + baseBodyString + "_south"); } } } } else graphicbaseBodyNaked = pawnRenderer.nakedGraphic; } string rottingGraphicPath = null; if (pawnRenderer.rottingGraphic != null) { if (graphicSourceRotten == null) graphicSourceRotten = pawnRenderer.rottingGraphic; rottingGraphicPath = graphicSourceRotten.path; if (customPose != null) rottingGraphicPath = rottingGraphicPath.Insert(Math.Max(rottingGraphicPath.LastIndexOf('/'), 0), "/CustomPose/" + customPose); if (!rottingGraphicPath.Contains(baseBodyString)) { if (graphicbaseBodyRotten == null) { if (ContentFinder.Get((rottingGraphicPath + baseBodyStringWithSex + "_south"), false) != null) { //graphicSourceRotten = pawnRenderer.rottingGraphic; Shader shader = pawnRenderer.rottingGraphic.Shader; //if (!ShaderUtility.SupportsMaskTex(shader)) // shader = ShaderDatabase.CutoutSkinOverlay; graphicbaseBodyRotten = GraphicDatabase.Get(rottingGraphicPath + baseBodyStringWithSex, shader, pawnRenderer.rottingGraphic.drawSize, pawnRenderer.rottingGraphic.color, pawnRenderer.rottingGraphic.colorTwo, pawnRenderer.rottingGraphic.data); //pawnRenderer.rottingGraphic = graphicbaseBodyRotten; } else if (customPose != null) { rottingGraphicPath = pawnRenderer.rottingGraphic.path; if (ContentFinder.Get((rottingGraphicPath + baseBodyStringWithSex + "_south"), false) != null) { graphicSourceRotten = pawnRenderer.rottingGraphic; Shader shader = pawnRenderer.rottingGraphic.Shader; //if (!ShaderUtility.SupportsMaskTex(shader)) // shader = ShaderDatabase.CutoutSkinOverlay; graphicbaseBodyRotten = GraphicDatabase.Get(rottingGraphicPath + baseBodyStringWithSex, shader, pawnRenderer.rottingGraphic.drawSize, pawnRenderer.rottingGraphic.color, pawnRenderer.rottingGraphic.colorTwo, pawnRenderer.rottingGraphic.data); //pawnRenderer.rottingGraphic = graphicbaseBodyRotten; } else { if (SizedApparelSettings.Debug) Log.Warning("[SizedApparel] Missing BaseBodyTexture for naked Graphic: " + rottingGraphicPath + baseBodyStringWithSex + "_south"); } } if (graphicbaseBodyRotten == null) { if (ContentFinder.Get((rottingGraphicPath + baseBodyString + "_south"), false) != null) { //graphicSourceRotten = pawnRenderer.rottingGraphic; Shader shader = pawnRenderer.rottingGraphic.Shader; //if (!ShaderUtility.SupportsMaskTex(shader)) // shader = ShaderDatabase.CutoutSkinOverlay; graphicbaseBodyRotten = GraphicDatabase.Get(rottingGraphicPath + baseBodyString, shader, pawnRenderer.rottingGraphic.drawSize, pawnRenderer.rottingGraphic.color, pawnRenderer.rottingGraphic.colorTwo, pawnRenderer.rottingGraphic.data); //pawnRenderer.rottingGraphic = graphicbaseBodyRotten; } else if (customPose != null) { rottingGraphicPath = pawnRenderer.rottingGraphic.path; if (ContentFinder.Get((rottingGraphicPath + baseBodyString + "_south"), false) != null) { graphicSourceRotten = pawnRenderer.rottingGraphic; Shader shader = pawnRenderer.rottingGraphic.Shader; //if (!ShaderUtility.SupportsMaskTex(shader)) // shader = ShaderDatabase.CutoutSkinOverlay; graphicbaseBodyRotten = GraphicDatabase.Get(rottingGraphicPath + baseBodyString, shader, pawnRenderer.rottingGraphic.drawSize, pawnRenderer.rottingGraphic.color, pawnRenderer.rottingGraphic.colorTwo, pawnRenderer.rottingGraphic.data); //pawnRenderer.rottingGraphic = graphicbaseBodyRotten; } else { if (SizedApparelSettings.Debug) Log.Warning("[SizedApparel] Missing BaseBodyTexture for naked Graphic: " + rottingGraphicPath + baseBodyString + "_south"); } } } } } else graphicbaseBodyRotten = pawnRenderer.rottingGraphic; } /* //Try to find sized Body if it's valid int offset = 9999; int currentBreastSizeIndex = 0; float currentBreastSeverity = 0; bool validNakedTexture = false; bool validRottingTexture = false; Graphic nakedGraphic; Graphic rottingGraphic; while (offset < SizedApparelUtility.size.Length) { string breastSeverityStringCache = SizedApparelUtility.BreastSeverityString(breastSeverity, offset, true, ref currentBreastSizeIndex, ref currentBreastSeverity); //search bigger //SizedApparelSettings.matchBodyTextureToMinimumApparelSize? currentBreastSizeIndex <= minSupportedBreasSizeIndex:true if (validNakedTexture == false && nakedGraphicPath !=null) { if ((ContentFinder.Get((nakedGraphicPath + breastSeverityStringCache + "_south"), false) != null)) { if (SizedApparelSettings.matchBodyTextureToMinimumApparelSize ? SizedApparelUtility.BreastSizeIndexToSeverity(currentBreastSizeIndex) <= breastSeverityCapToDraw : true) { nakedGraphic = GraphicDatabase.Get(nakedGraphicPath + breastSeverityStringCache, pawnRenderer.nakedGraphic.Shader, pawnRenderer.nakedGraphic.drawSize, pawnRenderer.nakedGraphic.color, pawnRenderer.nakedGraphic.colorTwo, pawnRenderer.nakedGraphic.data); //newAgr.Add(new ApparelGraphicRecord(graphic, agr.sourceApparel)); //validTexture = true; //Log.Message(path + BreastSeverityString(BreastSeverity, offset, !findBigger) + ":Texture Found"); pawnRenderer.nakedGraphic = nakedGraphic; validNakedTexture = true; } } } if (validRottingTexture == false && rottingGraphicPath != null) { if ((ContentFinder.Get((rottingGraphicPath + breastSeverityStringCache + "_south"), false) != null)) { if (SizedApparelSettings.matchBodyTextureToMinimumApparelSize ? SizedApparelUtility.BreastSizeIndexToSeverity(currentBreastSizeIndex) <= breastSeverityCapToDraw : true) { rottingGraphic = GraphicDatabase.Get(rottingGraphicPath + breastSeverityStringCache, pawnRenderer.rottingGraphic.Shader, pawnRenderer.rottingGraphic.drawSize, pawnRenderer.rottingGraphic.color, pawnRenderer.rottingGraphic.colorTwo, pawnRenderer.rottingGraphic.data); //newAgr.Add(new ApparelGraphicRecord(graphic, agr.sourceApparel)); //validTexture = true; //Log.Message(path + BreastSeverityString(BreastSeverity, offset, !findBigger) + ":Texture Found"); pawnRenderer.rottingGraphic = rottingGraphic; validRottingTexture = true; } } } //search smaller breastSeverityStringCache = SizedApparelUtility.BreastSeverityString(breastSeverity, offset, false, ref currentBreastSizeIndex, ref currentBreastSeverity); if (validNakedTexture == false) { if ((ContentFinder.Get((nakedGraphicPath + breastSeverityStringCache + "_south"), false) != null)) { if (SizedApparelSettings.matchBodyTextureToMinimumApparelSize ? SizedApparelUtility.BreastSizeIndexToSeverity(currentBreastSizeIndex) <= breastSeverityCapToDraw : true) { nakedGraphic = GraphicDatabase.Get(nakedGraphicPath + breastSeverityStringCache, pawnRenderer.nakedGraphic.Shader, pawnRenderer.nakedGraphic.drawSize, pawnRenderer.nakedGraphic.color, pawnRenderer.nakedGraphic.colorTwo, pawnRenderer.nakedGraphic.data); //newAgr.Add(new ApparelGraphicRecord(graphic, agr.sourceApparel)); //validTexture = true; //Log.Message(path + BreastSeverityString(BreastSeverity, offset, !findBigger) + ":Texture Found"); pawnRenderer.nakedGraphic = nakedGraphic; validNakedTexture = true; } } } if (validRottingTexture == false) { if ((ContentFinder.Get((rottingGraphicPath + breastSeverityStringCache + "_south"), false) != null)) { if (SizedApparelSettings.matchBodyTextureToMinimumApparelSize ? SizedApparelUtility.BreastSizeIndexToSeverity(currentBreastSizeIndex) <= breastSeverityCapToDraw : true) { rottingGraphic = GraphicDatabase.Get(rottingGraphicPath + breastSeverityStringCache, pawnRenderer.rottingGraphic.Shader, pawnRenderer.rottingGraphic.drawSize, pawnRenderer.rottingGraphic.color, pawnRenderer.rottingGraphic.colorTwo, pawnRenderer.rottingGraphic.data); //newAgr.Add(new ApparelGraphicRecord(graphic, agr.sourceApparel)); //validTexture = true; //Log.Message(path + BreastSeverityString(BreastSeverity, offset, !findBigger) + ":Texture Found"); pawnRenderer.rottingGraphic = rottingGraphic; validRottingTexture = true; } } } if (validNakedTexture == true && validRottingTexture == true) { if (SizedApparelSettings.Debug) Log.Message("[Sized Apparel] " + pawn.Name + "'s body texture has changed."); break; } offset++; } */ } //graphicBreasts = SizedApparelUtility.GetBodyPartGraphic(pawn, breastHediff, true, "Breasts", "Breasts"); //if(graphicBreasts == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) // graphicBreasts = SizedApparelUtility.GetBodyPartGraphic(pawn, breastHediff, true, "Breasts", "Breasts", false, true, "Humanlike"); string bodyPartPath = null; SizedApparelsDatabase.PathAndSize cachedPathAndSize; float breastSeverityCapped = breastSeverity; if (SizedApparelSettings.useBreastSizeCapForApparels) //SizedApparelSettings.useBreastSizeCapForApparels //wip breastSeverityCapped = Math.Min(BreastSeverityCache, breastSeverityCapped); string bodyTypeDefName = null; if (pawn.story != null) bodyTypeDefName = pawn.story.bodyType?.defName; if(breastHediff != null) { var breastvar = breastHediff.TryGetComp(); bodyPartBreasts.SetHediffData(breastHediff.def.defName, SizedApparelUtility.BreastSeverityInt(breastHediff.Severity), SizedApparelUtility.BreastSeverityInt(breastSeverityCapped), breastvar?.variation); bodyPartBreasts.UpdateGraphic(); } if (udderHediff != null) { var udderVar = udderHediff.TryGetComp(); bodyPartUdder.SetHediffData(udderHediff.def.defName, SizedApparelUtility.BreastSeverityInt(udderHediff.Severity), 1000, udderVar?.variation); bodyPartUdder.UpdateGraphic(); } else bodyPartUdder.SetHediffData(null, -1); float bellySeverity = 0; List pregnancies = pawn.health?.hediffSet?.hediffs?.FindAll((Hediff h) => h.def.defName.ToLower().Contains("pregnancy")); if (!pregnancies.NullOrEmpty()) { foreach (Hediff h in pregnancies) { bellySeverity = Math.Max(bellySeverity, h.Severity); } } /* List eggs = pawn.health?.hediffSet?.hediffs?.FindAll((Hediff h) => h.def.defName.ToLower().Contains("rjw") && h.def.defName.ToLower().Contains("egg")); if (!eggs.NullOrEmpty()) { foreach (Hediff h in eggs) { bellySeverity = Math.Max(bellySeverity, h.Severity); } } List mech = pawn.health?.hediffSet?.hediffs?.FindAll((Hediff h) => h.def.defName.ToLower().Contains("rjw") && h.def.defName.ToLower().Contains("mech")); if (!mech.NullOrEmpty()) { foreach (Hediff h in mech) { bellySeverity = Math.Max(bellySeverity, h.Severity); } } List parasite = pawn.health?.hediffSet?.hediffs?.FindAll((Hediff h) => h.def.defName.ToLower().Contains("parasite")); if (!parasite.NullOrEmpty()) { foreach (Hediff h in parasite) { bellySeverity = Math.Max(bellySeverity, h.Severity); } }*/ //Licentia Lab Hediff if (SizedApparelPatch.LicentiaActive) { Hediff cumflation = pawn.health?.hediffSet?.GetFirstHediffOfDef(HediffDef.Named("Cumflation")); Hediff cumstuffed = pawn.health?.hediffSet?.GetFirstHediffOfDef(HediffDef.Named("Cumstuffed")); bellySeverity += cumflation != null ? cumflation.Severity : 0; bellySeverity += cumstuffed != null ? cumstuffed.Severity : 0; } if (bellySeverity >= 0) { //var bellyVar = breastHediff.TryGetComp(); string BellyVar = null; bodyPartBelly.SetHediffData("BellyBulge", SizedApparelUtility.PrivatePartSeverityInt(bellySeverity),1000, BellyVar); bodyPartBelly.UpdateGraphic(); /* bodyPartPath = null; cachedPathAndSize = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, bodyTypeDefName, "BellyBulge", "Belly", SizedApparelUtility.PrivatePartSeverityInt(bellySeverity), false), false, "Belly", "BellyBulge"); bodyPartPath = cachedPathAndSize.pathWithSizeIndex; if (bodyPartPath != null) { if (cachedPathAndSize.isUnsupportedHumanlikePath) { if (SizedApparelSettings.UnsupportedRaceToUseHumanlike && pawn.RaceProps.Humanlike) graphicBelly = GraphicDatabase.Get(bodyPartPath); } else graphicBelly = GraphicDatabase.Get(bodyPartPath); }*/ //if (graphicVagina_horny == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) //{ // bodyPartPath = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, pawn.story?.bodyType.defName, vaginaHediff.def.defName, "Vagina", SizedApparelUtility.PrivatePartSeverityInt(vaginaHediff.Severity), true), false, "Vagina", "Vagina", "Humanlike").pathWithSizeIndex; // if (bodyPartPath != null) // graphicVagina_horny = GraphicDatabase.Get(bodyPartPath); //} } //graphicVagina = SizedApparelUtility.GetBodyPartGraphic(pawn, vaginaHediff, false, "Vagina", "Vagina"); //if(graphicVagina == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) // graphicVagina = SizedApparelUtility.GetBodyPartGraphic(pawn, vaginaHediff, false, "Vagina", "Vagina", false, true,"Humanlike"); if (vaginaHediff != null) { var vaginaVar = vaginaHediff.TryGetComp(); bodyPartVagina.SetHediffData(vaginaHediff.def.defName, SizedApparelUtility.PrivatePartSeverityInt(vaginaHediff.Severity),1000, vaginaVar?.variation); bodyPartVagina.UpdateGraphic(); /* bodyPartPath = null; cachedPathAndSize = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, bodyTypeDefName, vaginaHediff.def.defName, "Vagina", SizedApparelUtility.PrivatePartSeverityInt(vaginaHediff.Severity), false), false, "Vagina", "Vagina"); bodyPartPath = cachedPathAndSize.pathWithSizeIndex; if (bodyPartPath != null) { if (cachedPathAndSize.isUnsupportedHumanlikePath) { if (SizedApparelSettings.UnsupportedRaceToUseHumanlike && pawn.RaceProps.Humanlike) graphicVagina = GraphicDatabase.Get(bodyPartPath); } else graphicVagina = GraphicDatabase.Get(bodyPartPath); } bodyPartPath = null; cachedPathAndSize = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, bodyTypeDefName, vaginaHediff.def.defName, "Vagina", SizedApparelUtility.PrivatePartSeverityInt(vaginaHediff.Severity), true), false, "Vagina", "Vagina"); bodyPartPath = cachedPathAndSize.pathWithSizeIndex; if (bodyPartPath != null) { if (cachedPathAndSize.isUnsupportedHumanlikePath) { if (SizedApparelSettings.UnsupportedRaceToUseHumanlike && pawn.RaceProps.Humanlike) graphicVagina_horny = GraphicDatabase.Get(bodyPartPath); } else graphicVagina_horny = GraphicDatabase.Get(bodyPartPath); }*/ //if (graphicVagina_horny == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) //{ // bodyPartPath = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, pawn.story?.bodyType.defName, vaginaHediff.def.defName, "Vagina", SizedApparelUtility.PrivatePartSeverityInt(vaginaHediff.Severity), true), false, "Vagina", "Vagina", "Humanlike").pathWithSizeIndex; // if (bodyPartPath != null) // graphicVagina_horny = GraphicDatabase.Get(bodyPartPath); //} } else bodyPartVagina.SetHediffData(null, -1); //graphicVagina_horny = SizedApparelUtility.GetBodyPartGraphic(pawn, vaginaHediff, false, "Vagina", "Vagina", true); //if(graphicVagina_horny == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) // graphicVagina_horny = SizedApparelUtility.GetBodyPartGraphic(pawn, vaginaHediff, false, "Vagina", "Vagina", true, true, "Humanlike"); /* graphicPenises.Clear(); graphicPenises_horny.Clear(); graphicBallsOfPenises.Clear(); */ //TODO: Optimize bodyPartPenises.Clear(); bodyPartBalls.Clear(); if (penisHediffs != null) { for (int i = 0; i < penisHediffs.Count; i++) { Hediff penisHediff = penisHediffs[i]; float offsetX = 0; // right and left float offsetZ = 0; // up and down float t = (i + 1f) / (penisHediffs.Count + 1); offsetX = Mathf.Lerp(-0.05f, 0.05f, t); offsetZ = Mathf.Lerp(-0.02f, 0.02f, t); if (penisHediff == null) continue; var penisVar = penisHediff.TryGetComp(); SizedApparelBodyPart penis = new SizedApparelBodyPart(pawn, "Penis", SizedApparelBodyPartOf.Penis, "Penis", false, false); penis.SetDepthOffsets(0.0108f, 0.0025f, 0.0108f, 0.0108f); penis.SetPositionOffsets(new Vector2(offsetX, 0), new Vector2(-offsetX, 0), new Vector2(offsetX, offsetZ), new Vector2(offsetX, -offsetZ)); penis.SetHediffData(penisHediff.def.defName, SizedApparelUtility.PrivatePartSeverityInt(penisHediff.Severity),1000,penisVar?.variation); penis.UpdateGraphic(); bodyPartPenises.Add(penis); SizedApparelBodyPart balls = new SizedApparelBodyPart(pawn, "Balls", SizedApparelBodyPartOf.Penis, "Penis", false, false, "Penis/Balls"); balls.SetDepthOffsets(0.0096f, 0.0085f, 0.0096f, 0.0096f); balls.SetPositionOffsets(new Vector2(offsetX, 0), new Vector2(-offsetX, 0), new Vector2(offsetX, offsetZ), new Vector2(offsetX, -offsetZ)); balls.SetHediffData(penisHediff.def.defName, SizedApparelUtility.PrivatePartSeverityInt(penisHediff.Severity), 1000, penisVar?.variation); balls.UpdateGraphic(); bodyPartBalls.Add(balls); /* Graphic penisGraphic = SizedApparelUtility.GetBodyPartGraphic(pawn, penisHediff, false, "Penis", "Penis"); if (penisGraphic == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) penisGraphic = SizedApparelUtility.GetBodyPartGraphic(pawn, penisHediff, false, "Penis", "Penis", false, true, "Humanlike"); Graphic penisGraphicHorny = SizedApparelUtility.GetBodyPartGraphic(pawn, penisHediff, false, "Penis", "Penis", true); if (penisGraphicHorny == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) penisGraphicHorny = SizedApparelUtility.GetBodyPartGraphic(pawn, penisHediff, false, "Penis", "Penis", true, true, "Humanlike"); */ /* Graphic penisGraphic = null; bodyPartPath = null; cachedPathAndSize = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, bodyTypeDefName, penisHediff.def.defName, "Penis", SizedApparelUtility.PrivatePartSeverityInt(penisHediff.Severity), false), false, "Penis", "Penis"); bodyPartPath = cachedPathAndSize.pathWithSizeIndex; if (bodyPartPath != null) { if (cachedPathAndSize.isUnsupportedHumanlikePath) { if (SizedApparelSettings.UnsupportedRaceToUseHumanlike && pawn.RaceProps.Humanlike) penisGraphic = GraphicDatabase.Get(bodyPartPath); } else penisGraphic = GraphicDatabase.Get(bodyPartPath); } //if (penisGraphic == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) //{ // bodyPartPath = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, pawn.story?.bodyType.defName, penisHediff.def.defName, "Penis", SizedApparelUtility.PrivatePartSeverityInt(penisHediff.Severity), false), false, "Penis", "Penis", "Humanlike").pathWithSizeIndex; // if (bodyPartPath != null) // penisGraphic = GraphicDatabase.Get(bodyPartPath); //} Graphic penisGraphicHorny = null; bodyPartPath = null; cachedPathAndSize = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, bodyTypeDefName, penisHediff.def.defName, "Penis", SizedApparelUtility.PrivatePartSeverityInt(penisHediff.Severity), true), false, "Penis", "Penis"); bodyPartPath = cachedPathAndSize.pathWithSizeIndex; if (bodyPartPath != null) { if (cachedPathAndSize.isUnsupportedHumanlikePath) { if (SizedApparelSettings.UnsupportedRaceToUseHumanlike && pawn.RaceProps.Humanlike) penisGraphicHorny = GraphicDatabase.Get(bodyPartPath); } else penisGraphicHorny = GraphicDatabase.Get(bodyPartPath); } //if (penisGraphicHorny == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) //{ // bodyPartPath = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, pawn.story?.bodyType.defName, penisHediff.def.defName, "Penis", SizedApparelUtility.PrivatePartSeverityInt(penisHediff.Severity), true), false, "Penis", "Penis", "Humanlike").pathWithSizeIndex; // if (bodyPartPath != null) // penisGraphicHorny = GraphicDatabase.Get(bodyPartPath); //} //balls are no need horny graphic. it wiil share sametime //Graphic ballGraphic = SizedApparelUtility.GetBodyPartGraphic(pawn, penisHediff, false, "Penis/Balls", "Penis", false); //if (ballGraphic == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) // ballGraphic = SizedApparelUtility.GetBodyPartGraphic(pawn, penisHediff, false, "Penis/Balls", "Penis", false, true, "Humanlike"); Graphic ballGraphic = null; bodyPartPath = null; cachedPathAndSize = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, bodyTypeDefName, "Penis/Balls", penisHediff.def.defName, SizedApparelUtility.PrivatePartSeverityInt(penisHediff.Severity), false), false, "Penis/Balls", "Penis"); bodyPartPath = cachedPathAndSize.pathWithSizeIndex; if (bodyPartPath != null) { if (cachedPathAndSize.isUnsupportedHumanlikePath) { if (SizedApparelSettings.UnsupportedRaceToUseHumanlike && pawn.RaceProps.Humanlike) ballGraphic = GraphicDatabase.Get(bodyPartPath); } else ballGraphic = GraphicDatabase.Get(bodyPartPath); } //if (ballGraphic == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) //{ // bodyPartPath = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, pawn.story?.bodyType.defName, "Penis/Balls", penisHediff.def.defName, SizedApparelUtility.PrivatePartSeverityInt(penisHediff.Severity), false), false, "Penis/Balls", "Penis", "Humanlike").pathWithSizeIndex; // if (bodyPartPath != null) // ballGraphic = GraphicDatabase.Get(bodyPartPath); //} if (true)//penisGraphic != null { graphicPenises.Add(penisGraphic); graphicPenises_horny.Add(penisGraphicHorny); graphicBallsOfPenises.Add(ballGraphic); } */ } } /* graphicAnus = SizedApparelUtility.GetBodyPartGraphic(pawn, anusHediff, false, "Anus", "Anus"); if (graphicAnus == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) graphicAnus = SizedApparelUtility.GetBodyPartGraphic(pawn, anusHediff, false, "Anus", "Anus", false, true, "Humanlike"); graphicAnus_horny = SizedApparelUtility.GetBodyPartGraphic(pawn, anusHediff, false, "Anus", "Anus", true); if (graphicAnus_horny == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) graphicAnus_horny = SizedApparelUtility.GetBodyPartGraphic(pawn, anusHediff, false, "Anus", "Anus", true, true, "Humanlike"); */ if(anusHediff != null) { var anusVar = anusHediff.TryGetComp(); bodyPartAnus.SetHediffData(anusHediff.def.defName, SizedApparelUtility.PrivatePartSeverityInt(anusHediff.Severity),1000, anusVar?.variation); bodyPartAnus.UpdateGraphic(); /* bodyPartPath = null; cachedPathAndSize = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, bodyTypeDefName, anusHediff.def.defName, "Anus", SizedApparelUtility.PrivatePartSeverityInt(anusHediff.Severity), false), false, "Anus", "Anus"); bodyPartPath = cachedPathAndSize.pathWithSizeIndex; if (bodyPartPath != null) { if (cachedPathAndSize.isUnsupportedHumanlikePath) { if (SizedApparelSettings.UnsupportedRaceToUseHumanlike && pawn.RaceProps.Humanlike) graphicAnus = GraphicDatabase.Get(bodyPartPath); } else graphicAnus = GraphicDatabase.Get(bodyPartPath); } //if (graphicAnus == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) //{ // bodyPartPath = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, pawn.story?.bodyType.defName, anusHediff.def.defName, "Anus", SizedApparelUtility.PrivatePartSeverityInt(anusHediff.Severity), false), false, "Anus", "Anus", "Humanlike").pathWithSizeIndex; // if (bodyPartPath != null) // graphicAnus = GraphicDatabase.Get(bodyPartPath); //} bodyPartPath = null; cachedPathAndSize = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, bodyTypeDefName, anusHediff.def.defName, "Anus", SizedApparelUtility.PrivatePartSeverityInt(anusHediff.Severity), true), false, "Anus", "Anus"); bodyPartPath = cachedPathAndSize.pathWithSizeIndex; if (bodyPartPath != null) { if (cachedPathAndSize.isUnsupportedHumanlikePath) { if (SizedApparelSettings.UnsupportedRaceToUseHumanlike && pawn.RaceProps.Humanlike) graphicAnus_horny = GraphicDatabase.Get(bodyPartPath); } else graphicAnus_horny = GraphicDatabase.Get(bodyPartPath); } //if (graphicAnus_horny == null && pawn.RaceProps.Humanlike && SizedApparelSettings.UnsupportedRaceToUseHumanlike) //{ // bodyPartPath = SizedApparelsDatabase.GetSupportedBodyPartPath(new SizedApparelsDatabase.BodyPartDatabaseKey(pawn.def.defName, pawn.story?.bodyType.defName, anusHediff.def.defName, "Anus", SizedApparelUtility.PrivatePartSeverityInt(anusHediff.Severity), true), false, "Anus", "Anus", "Humanlike").pathWithSizeIndex; // if (bodyPartPath != null) // graphicAnus_horny = GraphicDatabase.Get(bodyPartPath); //}*/ } else bodyPartAnus.SetHediffData(null, -1); hasGraphicUpdatedBefore = true; } if(CheckApparel) cachedApparelGraphicRecord = pawnRenderer.apparelGraphics.ToList(); else cachedApparelGraphicRecord = new List(); hasUpdateBeforeSuccess = true; } //public bool hasUnsupportedApparel => Props.hasUnsupportedApparel; //public bool hasUpdateBefore => Props.hasUpdateBefore; /* public void SetHasUnsupportedApparel(bool _hasUnsupportedApparel) { if(Props !=null) Props.hasUnsupportedApparel = _hasUnsupportedApparel; this.hasUnsupportedApparel = _hasUnsupportedApparel; } public void SetHasUpdateBefore(bool _hasUpdateBefore) { if (Props != null) Props.hasUpdateBefore = _hasUpdateBefore; this.hasUpdateBefore = _hasUpdateBefore; }*/ public IEnumerable GetAllSizedApparelBodyPart() // can return null bodyparts { yield return bodyPartBreasts; yield return bodyPartNipple; /* foreach (SizedApparelBodyPart bp in bodyPartBreasts) { yield return bp; } foreach (SizedApparelBodyPart bp in bodyPartNipple) { yield return bp; }*/ foreach (SizedApparelBodyPart bp in bodyPartPenises) { yield return bp; } foreach (SizedApparelBodyPart bp in bodyPartBalls) { yield return bp; } yield return bodyPartVagina; yield return bodyPartAnus; yield return bodyPartBelly; yield return bodyPartMuscleOverlay;//TODO yield return bodyPartUdder; yield return bodyPartPubicHair; //TODO yield return bodyPartHips; foreach (SizedApparelBodyPart bp in bodyPartThighs) { yield return bp; } foreach (SizedApparelBodyPart bp in bodyPartHands) { yield return bp; } foreach (SizedApparelBodyPart bp in bodyPartFeet) { yield return bp; } } public IEnumerable GetSizedApparelBodyParts(SizedApparelBodyPartOf targetPartOf, bool returnNullPart = false) { foreach(SizedApparelBodyPart bp in GetAllSizedApparelBodyPart()) { if (bp == null) { if (returnNullPart) yield return bp; else continue; } if (bp.bodyPartOf.IsPartOf(targetPartOf)) yield return bp; } } public void SetPoseFromPoseSet(string poseSetName, bool autoUpdate = true, bool autoSetPawnGraphicDirty = false) { if (poseSetName == null) { ClearAllPose(autoUpdate, autoSetPawnGraphicDirty); return; } var poseSetDef = DefDatabase.GetNamed(poseSetName,false); if (poseSetDef == null) return; if (poseSetDef.poses.NullOrEmpty()) return; foreach (SizedApparelPose pose in poseSetDef.poses) { var bodyParts = GetSizedApparelBodyParts(pose.targetBodyPart); //if (bodyParts == null) // continue; if (bodyParts.EnumerableNullOrEmpty()) continue; foreach (SizedApparelBodyPart bp in bodyParts.ToList()) { if(bp != null) bp.SetCustomPose(poseSetName, autoUpdate, autoSetPawnGraphicDirty); } } } public void ClearAllPose(bool autoUpdate = true, bool autoSetPawnGraphicDirty = false) { foreach (SizedApparelBodyPart bp in GetAllSizedApparelBodyPart()) { if(bp != null) bp.SetCustomPose(null, autoUpdate, autoSetPawnGraphicDirty); } } public void ClearPose(SizedApparelBodyPartOf targetPartOf , bool autoUpdate = true, bool autoSetPawnGraphicDirty = false) { foreach (SizedApparelBodyPart bp in GetSizedApparelBodyParts(targetPartOf)) { if(bp != null) bp.SetCustomPose(null, autoUpdate, autoSetPawnGraphicDirty); } } } [StaticConstructorOnStartup] public class ApparelRecorderCompProperties : CompProperties { public bool hasUnsupportedApparel = false; public bool hasUpdateBefore = false; public ApparelRecorderCompProperties() { this.compClass = typeof(ApparelRecorderComp); } public ApparelRecorderCompProperties(Type compClass) : base(compClass) { this.compClass = compClass; } } }