v 1.2.1
This commit is contained in:
parent
8e6918ae70
commit
0fcdce6dc1
24 changed files with 122 additions and 226 deletions
|
@ -29,7 +29,8 @@ namespace Rimworld_Animations_Patch
|
|||
{
|
||||
Graphic graphicWithApparelMask = GraphicDatabase.Get<Graphic_Multi>(graphic.path, ShaderDatabase.CutoutComplex, apparel.def.graphicData.drawSize, apparel.DrawColor, apparel.DrawColor, null, "Masks/apparel_shirt_mask_" + bodyType.defName);
|
||||
graphic = GraphicMaskingUtility.ApplyGraphicWithMasks(graphic, graphicWithApparelMask, true);
|
||||
DebugMode.Message("Applying apparel mask: Masks/apparel_shirt_mask_" + bodyType.defName + " to " + apparel.def.defName + " (" + graphic.path + ")");
|
||||
|
||||
//DebugMode.Message("Applying apparel mask: Masks/apparel_shirt_mask_" + bodyType.defName + " to " + apparel.def.defName + " (" + graphic.path + ")");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -83,12 +83,15 @@ namespace Rimworld_Animations_Patch
|
|||
|
||||
if (__instance.pawn.apparel.WornApparel.NullOrEmpty() == false)
|
||||
{
|
||||
foreach(Apparel apparel in __instance.pawn.apparel.WornApparel)
|
||||
foreach (Apparel apparel in __instance.pawn.apparel.WornApparel)
|
||||
{
|
||||
CompApparelVisibility comp = apparel.TryGetComp<CompApparelVisibility>();
|
||||
|
||||
if (comp != null)
|
||||
{ comp.isBeingWorn = true; }
|
||||
{
|
||||
comp.isBeingWorn = true;
|
||||
comp.rimNudeDataStatus = RimNudeDataStatus.NotLoaded;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,6 +24,8 @@ namespace Rimworld_Animations_Patch
|
|||
postfix: new HarmonyMethod(AccessTools.Method(typeof(HarmonyPatch_Rimworld_Animations), "Postfix_RerollAnimations")));
|
||||
(new Harmony("Rimworld_Animations_Patch")).Patch(AccessTools.Method(AccessTools.TypeByName("Rimworld_Animations.HarmonyPatch_AlienRace"), "Prefix_AnimateHeadAddons"),
|
||||
prefix: new HarmonyMethod(AccessTools.Method(typeof(HarmonyPatch_Rimworld_Animations), "Prefix_DrawAddons")));
|
||||
(new Harmony("Rimworld_Animations_Patch")).Patch(AccessTools.Method(AccessTools.TypeByName("BodyAddon"), "CanDrawAddon"),
|
||||
postfix: new HarmonyMethod(AccessTools.Method(typeof(HarmonyPatch_Rimworld_Animations), "Postfix_CanDrawAddon")));
|
||||
}
|
||||
|
||||
// Extend the animation selector's body part check to include hands and whether the pawn is in bed or not
|
||||
|
@ -81,101 +83,31 @@ namespace Rimworld_Animations_Patch
|
|||
}
|
||||
|
||||
// Determine if a body addon is covered by apparel
|
||||
/*public static bool BodyAddonCoveredByApparel(Pawn pawn, AlienPartGenerator.BodyAddon bodyAddon)
|
||||
{
|
||||
foreach (ApparelGraphicRecord apparelGraphicRecord in pawn.Drawer.renderer.graphics.apparelGraphics)
|
||||
{
|
||||
Apparel apparel = apparelGraphicRecord.sourceApparel;
|
||||
|
||||
if (apparel.def.apparel.bodyPartGroups.Any(x => bodyAddon.hiddenUnderApparelFor.Contains(x)))
|
||||
{ return true; }
|
||||
}
|
||||
|
||||
return false;
|
||||
}*/
|
||||
|
||||
public static bool BodyAddonCoveredByWornApparel(Pawn pawn, AlienPartGenerator.BodyAddon bodyAddon)
|
||||
{
|
||||
if (bodyAddon?.hiddenUnderApparelFor == null || bodyAddon?.hiddenUnderApparelTag == null)
|
||||
if (pawn?.apparel?.WornApparel == null || bodyAddon == null)
|
||||
{ return false; }
|
||||
|
||||
foreach (Apparel apparel in pawn.apparel.WornApparel)
|
||||
{
|
||||
if (ApparelAnimationUtility.BodyAddonCoveredByApparel(apparel, bodyAddon))
|
||||
if (ApparelAnimationUtility.PrivatePartCoveredByApparel(apparel, bodyAddon.bodyPart))
|
||||
{ return true; }
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Determine if a body addon should be drawn
|
||||
public static bool CanDrawAddon(Pawn pawn, AlienPartGenerator.BodyAddon bodyAddon)
|
||||
public static void Postfix_CanDrawAddon(AlienPartGenerator.BodyAddon __instance, ref bool __result, Pawn pawn)
|
||||
{
|
||||
if (bodyAddon == null)
|
||||
{ return false; }
|
||||
if (__result == false) return;
|
||||
|
||||
if (pawn.RaceProps.Animal)
|
||||
{ return true; }
|
||||
|
||||
Building_Bed building_Bed = pawn.CurrentBed();
|
||||
|
||||
if ((building_Bed == null ||
|
||||
building_Bed.def.building.bed_showSleeperBody ||
|
||||
bodyAddon.drawnInBed) && (bodyAddon.backstoryRequirement.NullOrEmpty() || pawn.story.AllBackstories.Any((Backstory x) => x.identifier == bodyAddon.backstoryRequirement)))
|
||||
{
|
||||
if (!bodyAddon.drawnDesiccated)
|
||||
{
|
||||
Corpse corpse = pawn.Corpse;
|
||||
if (corpse != null && corpse.GetRotStage() == RotStage.Dessicated)
|
||||
{ return false; }
|
||||
}
|
||||
|
||||
if (!bodyAddon.bodyPart.NullOrEmpty() &&
|
||||
!pawn.health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined, null, null).Any((BodyPartRecord bpr) => bpr.untranslatedCustomLabel == bodyAddon.bodyPart || bpr.def.defName == bodyAddon.bodyPart))
|
||||
{
|
||||
List<AlienPartGenerator.BodyAddonHediffGraphic> list = bodyAddon.hediffGraphics;
|
||||
bool flag;
|
||||
if (list == null)
|
||||
{ flag = false; }
|
||||
|
||||
else
|
||||
{ flag = list.Any((AlienPartGenerator.BodyAddonHediffGraphic bahg) => bahg.hediff == HediffDefOf.MissingBodyPart); }
|
||||
|
||||
if (!flag)
|
||||
{ return false; }
|
||||
}
|
||||
|
||||
if ((pawn.gender == Gender.Female) ? bodyAddon.drawForFemale : bodyAddon.drawForMale)
|
||||
{
|
||||
if (bodyAddon.bodyTypeRequirement.NullOrEmpty() || pawn.story.bodyType.ToString() == bodyAddon.bodyTypeRequirement)
|
||||
{
|
||||
bool renderClothes = true;
|
||||
|
||||
if (Find.WindowStack.currentlyDrawnWindow is Page_ConfigureStartingPawns)
|
||||
{ renderClothes = (bool)AccessTools.Field(typeof(Page_ConfigureStartingPawns), "renderClothes").GetValue(Find.WindowStack.currentlyDrawnWindow); }
|
||||
|
||||
else
|
||||
{ renderClothes = pawn.Drawer.renderer.graphics.apparelGraphics.Count > 0; }
|
||||
|
||||
bool conditionA = !BodyAddonCoveredByWornApparel(pawn, bodyAddon);
|
||||
bool conditionB = !renderClothes;
|
||||
bool conditionC = pawn.GetPosture() == PawnPosture.Standing;
|
||||
bool conditionD = (pawn.GetPosture() == PawnPosture.LayingOnGroundNormal || pawn.GetPosture() == PawnPosture.LayingOnGroundFaceUp) && bodyAddon.drawnOnGround;
|
||||
bool conditionE = pawn.GetPosture() == PawnPosture.LayingInBed && bodyAddon.drawnInBed;
|
||||
|
||||
return (conditionA || conditionB) && (conditionC || conditionD || conditionE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
__result = BodyAddonCoveredByWornApparel(pawn, __instance) == false;
|
||||
}
|
||||
|
||||
// Replacement patch for AlienRace to draw the body addons
|
||||
public static bool Prefix_DrawAddons(PawnRenderFlags renderFlags, Vector3 vector, Vector3 headOffset, Pawn pawn, Quaternion quat, Rot4 rotation)
|
||||
{
|
||||
if (!(pawn.def is ThingDef_AlienRace alienProps) || renderFlags.FlagSet(PawnRenderFlags.Invisible))
|
||||
{ return false; }
|
||||
if (!(pawn.def is ThingDef_AlienRace alienProps) || renderFlags.FlagSet(PawnRenderFlags.Invisible)) return false;
|
||||
|
||||
// Try to draw apparel thrown on ground
|
||||
if (ApparelSettings.clothesThrownOnGround)
|
||||
|
@ -198,14 +130,19 @@ namespace Rimworld_Animations_Patch
|
|||
for (int idx = 0; idx < idxBodyAddons.Count; idx++)
|
||||
{
|
||||
int i = idxBodyAddons[idx];
|
||||
AlienPartGenerator.BodyAddon bodyAddon = bodyAddons[i];
|
||||
BodyPartRecord bodyPartRecord = AnimationPatchUtility.GetBodyPartRecord(pawn, bodyAddon.bodyPart);
|
||||
|
||||
AlienPartGenerator.BodyAddon bodyAddon = bodyAddons[i];
|
||||
Graphic addonGraphic = alienComp.addonGraphics[i];
|
||||
|
||||
bool canDraw = addonGraphic.path.ToLower().Contains("featureless") == false && bodyAddon.CanDrawAddon(pawn);
|
||||
bool drawHand = !renderFlags.FlagSet(PawnRenderFlags.Portrait) && BasicSettings.showHands && handsAvailableCount > 0 && HandAnimationUtility.BodyPartIsBeingTouched(pawn, addonGraphic.path, out var handData);
|
||||
|
||||
if (canDraw == false && drawHand == false)
|
||||
{ continue; }
|
||||
|
||||
BodyPartRecord bodyPartRecord = AnimationPatchUtility.GetBodyPartRecord(pawn, bodyAddon.bodyPart);
|
||||
bool alignWithHead = bodyAddon.alignWithHead || (bodyPartRecord != null && bodyPartRecord.IsInGroup(BodyPartGroupDefOf.FullHead));
|
||||
|
||||
Graphic addonGraphic = alienComp.addonGraphics[i];
|
||||
//DebugMode.Message(" Trying to draw " + addonGraphic.path);
|
||||
|
||||
Rot4 apparentRotation = rotation;
|
||||
if (!renderFlags.FlagSet(PawnRenderFlags.Portrait) && pawnAnimator != null && pawnAnimator.isAnimating)
|
||||
{ apparentRotation = alignWithHead ? pawnAnimator.headFacing : pawnAnimator.bodyFacing; }
|
||||
|
@ -216,8 +153,7 @@ namespace Rimworld_Animations_Patch
|
|||
Vector3 vector2 = bodyTypeOffset + ((offsets != null) ? offsets.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, alienComp.crownType) : Vector3.zero);
|
||||
|
||||
// Offset private parts so that they render over tattoos but under apparel (rendering under tatoos looks weird)
|
||||
if ((bodyPartRecord != null && (bodyPartRecord.IsInGroup(PatchBodyPartGroupDefOf.GenitalsBPG) || bodyPartRecord.IsInGroup(PatchBodyPartGroupDefOf.ChestBPG) || bodyPartRecord.IsInGroup(PatchBodyPartGroupDefOf.AnusBPG))) ||
|
||||
addonGraphic.path.ToLower().Contains("belly"))
|
||||
if ((bodyPartRecord != null && (bodyPartRecord.IsInGroup(PatchBodyPartGroupDefOf.GenitalsBPG) || bodyPartRecord.IsInGroup(PatchBodyPartGroupDefOf.ChestBPG) || bodyPartRecord.IsInGroup(PatchBodyPartGroupDefOf.AnusBPG))) || addonGraphic.path.ToLower().Contains("belly"))
|
||||
{
|
||||
vector2.y = (vector2.y + 0.40f) / 1000f + 0.012f;
|
||||
|
||||
|
@ -225,7 +161,6 @@ namespace Rimworld_Animations_Patch
|
|||
if (pawn.RaceProps.Humanlike &&
|
||||
addonGraphic.path.ToLower().Contains("penis") &&
|
||||
addonGraphic.path.ToLower().Contains("flaccid") == false &&
|
||||
BodyAddonCoveredByWornApparel(pawn, bodyAddon) == false &&
|
||||
apparentRotation == Rot4.South)
|
||||
{ vector2.y += 0.010f; }
|
||||
}
|
||||
|
@ -289,7 +224,7 @@ namespace Rimworld_Animations_Patch
|
|||
finalAngle = bodyAngle;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Fixes 'leaning left' issue with Yayo's animations
|
||||
else if (!renderFlags.FlagSet(PawnRenderFlags.Portrait) && (pawnAnimator == null || pawnAnimator.isAnimating == false))
|
||||
{
|
||||
|
@ -302,26 +237,29 @@ namespace Rimworld_Animations_Patch
|
|||
{ vector2 -= pawn.Drawer.renderer.BaseHeadOffsetAt(apparentRotation); }
|
||||
|
||||
Vector3 finalPosition = vector + (alignWithHead ? headOffset : Vector3.zero) + vector2.RotatedBy(angle: Mathf.Acos(f: Quaternion.Dot(a: Quaternion.identity, b: addonRotation)) * 2f * 57.29578f);
|
||||
|
||||
|
||||
// Draw the addon if visible
|
||||
if (CanDrawAddon(pawn, bodyAddon))
|
||||
{
|
||||
if (canDraw)
|
||||
{
|
||||
//DebugMode.Message("Drawing " + addonGraphic.path);
|
||||
|
||||
GenDraw.DrawMeshNowOrLater(mesh: addonGraphic.MeshAt(rot: apparentRotation),
|
||||
loc: finalPosition,
|
||||
quat: Quaternion.AngleAxis(angle: bodyAddonAngle, axis: Vector3.up) * quatAdditional * addonRotation,
|
||||
mat: addonGraphic.MatAt(rot: apparentRotation), renderFlags.FlagSet(PawnRenderFlags.DrawNow));
|
||||
mat: addonGraphic.MatAt(rot: apparentRotation),
|
||||
drawNow: renderFlags.FlagSet(PawnRenderFlags.DrawNow));
|
||||
}
|
||||
|
||||
// Draw hand over the body part if required
|
||||
if (BasicSettings.showHands && !renderFlags.FlagSet(PawnRenderFlags.Portrait) && handsAvailableCount > 0)
|
||||
if (drawHand)
|
||||
{
|
||||
if (HandAnimationUtility.TryToDrawHand(pawn, addonGraphic.path, finalPosition, finalAngle, rotation, renderFlags))
|
||||
{ handsAvailableCount--; }
|
||||
}
|
||||
}
|
||||
|
||||
// Body addons are sometimes are not appropriately concealed by long hair, so re-draw the pawn's hair here
|
||||
if (pawn.Drawer.renderer.graphics.headGraphic != null)
|
||||
// Body addons are sometimes are not appropriately concealed by long hair in portraits, so re-draw the pawn's hair here
|
||||
if (pawn.Drawer.renderer.graphics.headGraphic != null && renderFlags.FlagSet(PawnRenderFlags.Portrait) && BasicSettings.redrawHair)
|
||||
{
|
||||
var methodInfo = AccessTools.Method(typeof(PawnRenderer), "DrawHeadHair", null, null);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue