sizedapparel/1.3/source/SizedApparel/SizedApparelComp.cs

1272 lines
68 KiB
C#

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<ApparelGraphicRecord> cachedApparelGraphicRecord = new List<ApparelGraphicRecord>();
public Hediff breastHediff = null; //TODO: Make this as List
public Hediff vaginaHediff = null;
public List<Hediff> 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<SizedApparelBodyPart> bodyPartPenises = new List<SizedApparelBodyPart>();
public List<SizedApparelBodyPart> bodyPartBalls = new List<SizedApparelBodyPart>();
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<SizedApparelBodyPart> bodyPartThighs = new List<SizedApparelBodyPart>();
public List<SizedApparelBodyPart> bodyPartHands = new List<SizedApparelBodyPart>();
public List<SizedApparelBodyPart> bodyPartFeet = new List<SizedApparelBodyPart>();
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<Graphic> graphicPenises = new List<Graphic>();
[Obsolete]
public List<Graphic> graphicBallsOfPenises = new List<Graphic>();
[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<Graphic> graphicPenises_horny = new List<Graphic>();
[Obsolete]
public List<Graphic> graphicBalls_horny = new List<Graphic>();//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<string>(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<Graphic>();
else
graphicPenises.Clear();
if (graphicBallsOfPenises == null)
graphicBallsOfPenises = new List<Graphic>();
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<Graphic>();
else
graphicPenises_horny.Clear();
if (graphicBalls_horny == null)
graphicBalls_horny = new List<Graphic>();
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<Texture2D>.Get((nakedGraphicPath + baseBodyStringWithSex + "_south"), false) != null)
{
//graphicSourceNaked = pawnRenderer.nakedGraphic;
Shader shader = pawnRenderer.nakedGraphic.Shader;
//if (!ShaderUtility.SupportsMaskTex(shader))
// shader = ShaderDatabase.CutoutSkinOverlay;
graphicbaseBodyNaked = GraphicDatabase.Get<Graphic_Multi>(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<Texture2D>.Get((nakedGraphicPath + baseBodyStringWithSex + "_south"), false) != null)
{
//graphicSourceNaked = pawnRenderer.nakedGraphic;
Shader shader = pawnRenderer.nakedGraphic.Shader;
//if (!ShaderUtility.SupportsMaskTex(shader))
// shader = ShaderDatabase.CutoutSkinOverlay;
graphicbaseBodyNaked = GraphicDatabase.Get<Graphic_Multi>(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<Texture2D>.Get((nakedGraphicPath + baseBodyString + "_south"), false) != null)
{
// graphicSourceNaked = pawnRenderer.nakedGraphic;
Shader shader = pawnRenderer.nakedGraphic.Shader;
//if (!ShaderUtility.SupportsMaskTex(shader))
// shader = ShaderDatabase.CutoutSkinOverlay;
graphicbaseBodyNaked = GraphicDatabase.Get<Graphic_Multi>(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<Texture2D>.Get((nakedGraphicPath + baseBodyString + "_south"), false) != null)
{
//graphicSourceNaked = pawnRenderer.nakedGraphic;
Shader shader = pawnRenderer.nakedGraphic.Shader;
//if (!ShaderUtility.SupportsMaskTex(shader))
// shader = ShaderDatabase.CutoutSkinOverlay;
graphicbaseBodyNaked = GraphicDatabase.Get<Graphic_Multi>(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<Texture2D>.Get((rottingGraphicPath + baseBodyStringWithSex + "_south"), false) != null)
{
//graphicSourceRotten = pawnRenderer.rottingGraphic;
Shader shader = pawnRenderer.rottingGraphic.Shader;
//if (!ShaderUtility.SupportsMaskTex(shader))
// shader = ShaderDatabase.CutoutSkinOverlay;
graphicbaseBodyRotten = GraphicDatabase.Get<Graphic_Multi>(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<Texture2D>.Get((rottingGraphicPath + baseBodyStringWithSex + "_south"), false) != null)
{
graphicSourceRotten = pawnRenderer.rottingGraphic;
Shader shader = pawnRenderer.rottingGraphic.Shader;
//if (!ShaderUtility.SupportsMaskTex(shader))
// shader = ShaderDatabase.CutoutSkinOverlay;
graphicbaseBodyRotten = GraphicDatabase.Get<Graphic_Multi>(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<Texture2D>.Get((rottingGraphicPath + baseBodyString + "_south"), false) != null)
{
//graphicSourceRotten = pawnRenderer.rottingGraphic;
Shader shader = pawnRenderer.rottingGraphic.Shader;
//if (!ShaderUtility.SupportsMaskTex(shader))
// shader = ShaderDatabase.CutoutSkinOverlay;
graphicbaseBodyRotten = GraphicDatabase.Get<Graphic_Multi>(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<Texture2D>.Get((rottingGraphicPath + baseBodyString + "_south"), false) != null)
{
graphicSourceRotten = pawnRenderer.rottingGraphic;
Shader shader = pawnRenderer.rottingGraphic.Shader;
//if (!ShaderUtility.SupportsMaskTex(shader))
// shader = ShaderDatabase.CutoutSkinOverlay;
graphicbaseBodyRotten = GraphicDatabase.Get<Graphic_Multi>(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<Texture2D>.Get((nakedGraphicPath + breastSeverityStringCache + "_south"), false) != null))
{
if (SizedApparelSettings.matchBodyTextureToMinimumApparelSize ? SizedApparelUtility.BreastSizeIndexToSeverity(currentBreastSizeIndex) <= breastSeverityCapToDraw : true)
{
nakedGraphic = GraphicDatabase.Get<Graphic_Multi>(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<Texture2D>.Get((rottingGraphicPath + breastSeverityStringCache + "_south"), false) != null))
{
if (SizedApparelSettings.matchBodyTextureToMinimumApparelSize ? SizedApparelUtility.BreastSizeIndexToSeverity(currentBreastSizeIndex) <= breastSeverityCapToDraw : true)
{
rottingGraphic = GraphicDatabase.Get<Graphic_Multi>(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<Texture2D>.Get((nakedGraphicPath + breastSeverityStringCache + "_south"), false) != null))
{
if (SizedApparelSettings.matchBodyTextureToMinimumApparelSize ? SizedApparelUtility.BreastSizeIndexToSeverity(currentBreastSizeIndex) <= breastSeverityCapToDraw : true)
{
nakedGraphic = GraphicDatabase.Get<Graphic_Multi>(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<Texture2D>.Get((rottingGraphicPath + breastSeverityStringCache + "_south"), false) != null))
{
if (SizedApparelSettings.matchBodyTextureToMinimumApparelSize ? SizedApparelUtility.BreastSizeIndexToSeverity(currentBreastSizeIndex) <= breastSeverityCapToDraw : true)
{
rottingGraphic = GraphicDatabase.Get<Graphic_Multi>(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<SizedApparelBodyPartDetail>();
bodyPartBreasts.SetHediffData(breastHediff.def.defName, SizedApparelUtility.BreastSeverityInt(breastHediff.Severity), SizedApparelUtility.BreastSeverityInt(breastSeverityCapped), breastvar?.variation);
bodyPartBreasts.UpdateGraphic();
}
if (udderHediff != null)
{
var udderVar = udderHediff.TryGetComp<SizedApparelBodyPartDetail>();
bodyPartUdder.SetHediffData(udderHediff.def.defName, SizedApparelUtility.BreastSeverityInt(udderHediff.Severity), 1000, udderVar?.variation);
bodyPartUdder.UpdateGraphic();
}
else
bodyPartUdder.SetHediffData(null, -1);
float bellySeverity = 0;
List<Hediff> 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<Hediff> 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<Hediff> 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<Hediff> 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<SizedApparelBodyPartDetail>();
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<Graphic_Multi>(bodyPartPath);
}
else
graphicBelly = GraphicDatabase.Get<Graphic_Multi>(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<Graphic_Multi>(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<SizedApparelBodyPartDetail>();
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<Graphic_Multi>(bodyPartPath);
}
else
graphicVagina = GraphicDatabase.Get<Graphic_Multi>(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<Graphic_Multi>(bodyPartPath);
}
else
graphicVagina_horny = GraphicDatabase.Get<Graphic_Multi>(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<Graphic_Multi>(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<SizedApparelBodyPartDetail>();
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<Graphic_Multi>(bodyPartPath);
}
else
penisGraphic = GraphicDatabase.Get<Graphic_Multi>(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<Graphic_Multi>(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<Graphic_Multi>(bodyPartPath);
}
else
penisGraphicHorny = GraphicDatabase.Get<Graphic_Multi>(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<Graphic_Multi>(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<Graphic_Multi>(bodyPartPath);
}
else
ballGraphic = GraphicDatabase.Get<Graphic_Multi>(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<Graphic_Multi>(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<SizedApparelBodyPartDetail>();
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<Graphic_Multi>(bodyPartPath);
}
else
graphicAnus = GraphicDatabase.Get<Graphic_Multi>(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<Graphic_Multi>(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<Graphic_Multi>(bodyPartPath);
}
else
graphicAnus_horny = GraphicDatabase.Get<Graphic_Multi>(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<Graphic_Multi>(bodyPartPath);
//}*/
}
else
bodyPartAnus.SetHediffData(null, -1);
hasGraphicUpdatedBefore = true;
}
if(CheckApparel)
cachedApparelGraphicRecord = pawnRenderer.apparelGraphics.ToList();
else
cachedApparelGraphicRecord = new List<ApparelGraphicRecord>();
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<SizedApparelBodyPart> 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<SizedApparelBodyPart> 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<SizedApparelPoseSetDef>.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;
}
}
}