mirror of
https://gitgud.io/AbstractConcept/rimworld-animations-patch.git
synced 2024-08-15 00:43:27 +00:00
v 1.2.1
This commit is contained in:
parent
8e6918ae70
commit
0fcdce6dc1
24 changed files with 122 additions and 226 deletions
|
@ -15,14 +15,14 @@ namespace Rimworld_Animations_Patch
|
|||
|
||||
public static void TryToDrawApparelOnFloor(Pawn pawn)
|
||||
{
|
||||
if (pawn?.apparel?.WornApparel != null)
|
||||
if (pawn?.apparel?.WornApparel != null)
|
||||
{
|
||||
CompBodyAnimator compBodyAnimator = pawn.TryGetComp<CompBodyAnimator>();
|
||||
CompBodyAnimator compBodyAnimator = pawn.TryGetComp<CompBodyAnimator>();
|
||||
|
||||
if (ApparelSettings.clothesThrownOnGround == false || Find.CurrentMap != pawn.Map || compBodyAnimator == null || compBodyAnimator.isAnimating == false)
|
||||
if (ApparelSettings.clothesThrownOnGround == false || Find.CurrentMap != pawn.Map || compBodyAnimator == null || compBodyAnimator.isAnimating == false)
|
||||
{ return; }
|
||||
|
||||
foreach (Apparel apparel in pawn.apparel.WornApparel)
|
||||
|
||||
foreach (Apparel apparel in pawn.apparel.WornApparel)
|
||||
{
|
||||
CompApparelVisibility compApparelVisibility = apparel.TryGetComp<CompApparelVisibility>();
|
||||
|
||||
|
@ -40,64 +40,48 @@ namespace Rimworld_Animations_Patch
|
|||
|
||||
apparelGraphic.drawSize.x *= 1f / apparelScale;
|
||||
apparelGraphic.drawSize.y *= 1f / apparelScale;
|
||||
DebugMode.Message(compApparelVisibility.rotation.ToString());
|
||||
|
||||
//DebugMode.Message("Drawing " + apparel.def.defName + " on ground");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static bool BodyAddonCoveredByApparel(Apparel apparel, AlienPartGenerator.BodyAddon bodyAddon)
|
||||
public static bool PrivatePartCoveredByApparel(Apparel apparel, string bodyPart)
|
||||
{
|
||||
CompApparelVisibility comp = apparel.TryGetComp<CompApparelVisibility>();
|
||||
|
||||
if (comp != null && comp.isBeingWorn == false)
|
||||
if (comp == null || comp.rimNudeDataStatus == RimNudeDataStatus.Unavailable)
|
||||
{ return false; }
|
||||
|
||||
RimNudeData rimNudeData = ApparelSettings.GetRimNudeData(apparel);
|
||||
|
||||
if (rimNudeData != null && bodyAddon?.bodyPart != null)
|
||||
if (comp.rimNudeDataStatus == RimNudeDataStatus.NotLoaded)
|
||||
{
|
||||
if (bodyAddon.bodyPart == "Genitals" && rimNudeData.coversGroin == false)
|
||||
{ return false; }
|
||||
RimNudeData rimNudeData = ApparelSettings.GetRimNudeData(apparel);
|
||||
|
||||
if (bodyAddon.bodyPart == "Chest" && rimNudeData.coversChest == false)
|
||||
{ return false; }
|
||||
if (rimNudeData == null)
|
||||
{
|
||||
comp.rimNudeDataStatus = RimNudeDataStatus.Unavailable;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (bodyAddon.bodyPart == "Torso" && rimNudeData.coversBelly == false)
|
||||
{ return false; }
|
||||
comp.coversBelly = rimNudeData.coversBelly;
|
||||
comp.coversChest = rimNudeData.coversChest;
|
||||
comp.coversGroin = rimNudeData.coversGroin;
|
||||
|
||||
comp.rimNudeDataStatus = RimNudeDataStatus.Loaded;
|
||||
}
|
||||
|
||||
if (apparel.def.apparel.bodyPartGroups.Any(x => bodyAddon.hiddenUnderApparelFor.Contains(x)) ||
|
||||
apparel.def.apparel.tags.Any(x => bodyAddon.hiddenUnderApparelTag.Contains(x)))
|
||||
{ return true; }
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool BodyPartCoveredByApparel(Apparel apparel, BodyPartRecord bodyPart)
|
||||
{
|
||||
CompApparelVisibility comp = apparel.TryGetComp<CompApparelVisibility>();
|
||||
|
||||
if (comp != null && comp.isBeingWorn == false)
|
||||
if (comp.isBeingWorn == false)
|
||||
{ return false; }
|
||||
|
||||
RimNudeData rimNudeData = ApparelSettings.GetRimNudeData(apparel);
|
||||
if (bodyPart == "Genitals")
|
||||
{ return comp.coversGroin; }
|
||||
|
||||
if (rimNudeData != null)
|
||||
{
|
||||
if (bodyPart.def.defName == "Genitals" && rimNudeData.coversGroin == false)
|
||||
{ return false; }
|
||||
if (bodyPart == "Chest")
|
||||
{ return comp.coversChest; }
|
||||
|
||||
if (bodyPart.def.defName == "Chest" && rimNudeData.coversChest == false)
|
||||
{ return false; }
|
||||
|
||||
if (bodyPart.def.defName == "Torso" && rimNudeData.coversBelly == false)
|
||||
{ return false; }
|
||||
}
|
||||
|
||||
if (apparel.def.apparel.CoversBodyPart(bodyPart))
|
||||
{ return true; }
|
||||
if (bodyPart == "Torso")
|
||||
{ return comp.coversBelly; }
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -109,9 +93,10 @@ namespace Rimworld_Animations_Patch
|
|||
if (pawn.RaceProps.Humanlike == false || pawn?.apparel?.WornApparel == null || jobdriver == null)
|
||||
{ return; }
|
||||
|
||||
foreach (Apparel apparel in pawn.apparel?.WornApparel)
|
||||
foreach (Apparel apparel in pawn.apparel.WornApparel)
|
||||
{
|
||||
CompApparelVisibility comp = apparel.TryGetComp<CompApparelVisibility>();
|
||||
|
||||
if (comp != null)
|
||||
{ comp.isBeingWorn = true; }
|
||||
}
|
||||
|
@ -177,19 +162,19 @@ namespace Rimworld_Animations_Patch
|
|||
{ requiredGenitals = new List<string>(); }
|
||||
|
||||
if (anim.actors[actorID].isFucking || requiredGenitals.Contains("Penis"))
|
||||
{ bodyPartCovered = bodyPartCovered || BodyPartCoveredByApparel(apparel, bodyParts.FirstOrDefault(x => x.def == xxx.genitalsDef)); }
|
||||
{ bodyPartCovered = bodyPartCovered || PrivatePartCoveredByApparel(apparel, "Genitals"); }
|
||||
|
||||
if (anim.actors[actorID].isFucked || requiredGenitals.Contains("Vagina"))
|
||||
{ bodyPartCovered = bodyPartCovered || BodyPartCoveredByApparel(apparel, bodyParts.FirstOrDefault(x => x.def == xxx.genitalsDef)); }
|
||||
{ bodyPartCovered = bodyPartCovered || PrivatePartCoveredByApparel(apparel, "Genitals"); }
|
||||
|
||||
if (anim.actors[actorID].isFucked || requiredGenitals.Contains("Anus"))
|
||||
{ bodyPartCovered = bodyPartCovered || BodyPartCoveredByApparel(apparel, bodyParts.FirstOrDefault(x => x.def == xxx.anusDef)); }
|
||||
{ bodyPartCovered = bodyPartCovered || PrivatePartCoveredByApparel(apparel, "Genitals"); }
|
||||
|
||||
if (requiredGenitals.Contains("Breasts"))
|
||||
{ bodyPartCovered = bodyPartCovered || BodyPartCoveredByApparel(apparel, bodyParts.FirstOrDefault(x => x.def == xxx.breastsDef)); }
|
||||
{ bodyPartCovered = bodyPartCovered || PrivatePartCoveredByApparel(apparel, "Chest"); }
|
||||
|
||||
if (requiredGenitals.Contains("Mouth"))
|
||||
{ bodyPartCovered = bodyPartCovered || BodyPartCoveredByApparel(apparel, bodyParts.FirstOrDefault(x => x.def.defName.ToLower().ContainsAny("mouth", "teeth", "jaw", "beak"))); }
|
||||
{ bodyPartCovered = bodyPartCovered || apparel.def.apparel.CoversBodyPart(bodyParts.FirstOrDefault(x => x.def.defName.ToLower().ContainsAny("mouth", "teeth", "jaw", "beak"))); }
|
||||
|
||||
return bodyPartCovered;
|
||||
}
|
||||
|
|
|
@ -14,9 +14,6 @@ namespace Rimworld_Animations_Patch
|
|||
|
||||
foreach (ThingDef thingDef in DefDatabase<ThingDef>.AllDefs)
|
||||
{
|
||||
if (thingDef.IsApparel && thingDef.apparel.layers.Count == 1 && thingDef.apparel.layers[0] == ApparelLayerDefOf.Belt)
|
||||
{ continue; }
|
||||
|
||||
if (thingDef.IsApparel &&
|
||||
(thingDef.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Torso) ||
|
||||
thingDef.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Legs) ||
|
||||
|
|
|
@ -16,8 +16,11 @@ namespace Rimworld_Animations_Patch
|
|||
public static bool BodyPartIsBeingTouched(Pawn pawn, string bodypartFilePath, out List<HandAnimationData> handAnimationData)
|
||||
{
|
||||
handAnimationData = new List<HandAnimationData>();
|
||||
|
||||
ActorAnimationData actorAnimationData = pawn.GetAnimationData();
|
||||
|
||||
if (actorAnimationData == null)
|
||||
{ return false; }
|
||||
|
||||
HandAnimationDef handAnimationDef = DefDatabase<HandAnimationDef>.AllDefs.FirstOrDefault(x => x.animationDefName == actorAnimationData.animationDef.defName);
|
||||
|
||||
if (handAnimationDef == null)
|
||||
|
@ -47,13 +50,13 @@ namespace Rimworld_Animations_Patch
|
|||
|
||||
if (methodInfo == null)
|
||||
{
|
||||
Debug.LogWarning("Hand anaimation motion '" + handAnimationData.motion + "' was not found");
|
||||
Debug.LogWarning("Hand animation motion '" + handAnimationData.motion + "' was not found");
|
||||
return default;
|
||||
}
|
||||
|
||||
Vector3 handPosition = (Vector3)methodInfo.Invoke(null, new object[] { pawn, handAnimationData, baseAngle });
|
||||
|
||||
return handPosition * pawn.RaceProps.baseBodySize + basePosition;
|
||||
return handPosition * pawn.RaceProps.baseBodySize + basePosition + new Vector3(0f, 0.3f, 0f);
|
||||
}
|
||||
|
||||
public static float GetGenitalSize(Pawn pawn, string genitalName)
|
||||
|
@ -195,7 +198,7 @@ namespace Rimworld_Animations_Patch
|
|||
|
||||
public static bool TryToDrawHand(Pawn pawn, string bodyAddonName, Vector3 bodyAddonPosition, float bodyAddonAngle, Rot4 bodyAddonRotation, PawnRenderFlags renderFlags)
|
||||
{
|
||||
if (pawn.TryGetComp<CompBodyAnimator>() != null && pawn.TryGetComp<CompBodyAnimator>().isAnimating && BodyPartIsBeingTouched(pawn, bodyAddonName, out List<HandAnimationData> handAnimationData))
|
||||
if (BodyPartIsBeingTouched(pawn, bodyAddonName, out List<HandAnimationData> handAnimationData))
|
||||
{
|
||||
foreach (HandAnimationData datum in handAnimationData)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue