From 5f1b3a73e878bd6c4a4561ad85eedc5f6886b0bc Mon Sep 17 00:00:00 2001 From: Tory <22203-Tory@users.noreply.gitgud.io> Date: Thu, 22 Dec 2022 00:55:31 +0000 Subject: [PATCH 1/4] 2.2.15.7 --- About/Manifest.xml | 2 +- Common/Patches/NudePatch-Androids.xml | 1 + Common/Patches/NudePatch-Snake.xml | 362 ++++++++++++++++++++++++++ changelog.txt | 6 +- 4 files changed, 369 insertions(+), 2 deletions(-) create mode 100644 Common/Patches/NudePatch-Snake.xml diff --git a/About/Manifest.xml b/About/Manifest.xml index c9d1873..0512269 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,6 +1,6 @@ - 2.2.15.6 + 2.2.15.7 https://gitgud.io/Tory/rimnude-unofficial/-/raw/master/About/Manifest.xml https://gitgud.io/Tory/rimnude-unofficial/ diff --git a/Common/Patches/NudePatch-Androids.xml b/Common/Patches/NudePatch-Androids.xml index 8449960..c04a66f 100644 --- a/Common/Patches/NudePatch-Androids.xml +++ b/Common/Patches/NudePatch-Androids.xml @@ -6,6 +6,7 @@
  • Androids
  • +
  • Androids for RW 1.4
  • diff --git a/Common/Patches/NudePatch-Snake.xml b/Common/Patches/NudePatch-Snake.xml new file mode 100644 index 0000000..c7fd891 --- /dev/null +++ b/Common/Patches/NudePatch-Snake.xml @@ -0,0 +1,362 @@ + + + + + + + +
  • Snake Race
  • +
    + + +
  • + Defs/AlienRace.ThingDef_AlienRace[defName="SnakeFeral"]/alienRace/generalSettings/alienPartGenerator/bodyAddons + Always + + Defs/AlienRace.ThingDef_AlienRace[defName="SnakeFeral"]/alienRace/generalSettings/alienPartGenerator + + +
  • +
  • + Defs/AlienRace.ThingDef_AlienRace[defName="SnakeFeral"]/alienRace/generalSettings/alienPartGenerator/bodyAddons + +
  • + Breasts/FeaturelessLeft + .70 + Transparent + Chest + true + -0.2765 + false + +
  • Torso
  • + + + + + + Breasts/breasts_micro_left + + Breasts/breasts_huge_left + Breasts/breasts_huge_left + Breasts/breasts_large_left + Breasts/breasts_average_left + Breasts/breasts_small_left + Breasts/breasts_micro_left + + + + + + + Breasts/breasts_hyd_micro_left + + Breasts/breasts_hyd_huge_left + Breasts/breasts_hyd_huge_left + Breasts/breasts_hyd_large_left + Breasts/breasts_hyd_left + Breasts/breasts_hyd_small_left + Breasts/breasts_hyd_micro_left + + + + + Breasts/breasts_bio_micro_left + + Breasts/breasts_bio_huge_left + Breasts/breasts_bio_huge_left + Breasts/breasts_bio_large_left + Breasts/breasts_bio_left + Breasts/breasts_bio_small_left + Breasts/breasts_bio_micro_left + + + + + Breasts/Bionics/breasts_arc_micro_left + + Breasts/Bionics/breasts_arc_huge_left + Breasts/Bionics/breasts_arc_huge_left + Breasts/Bionics/breasts_arc_large_left + Breasts/Bionics/breasts_arc_left + Breasts/Bionics/breasts_arc_small_left + Breasts/Bionics/breasts_arc_micro_left + + + Injuries/breasts_missing_left + + + + Breasts/breasts_micro_left + + Breasts/breasts_huge_left + Breasts/breasts_huge_left + Breasts/breasts_large_left + Breasts/breasts_average_left + Breasts/breasts_small_left + Breasts/breasts_micro_left + + + + + Breasts/breasts_micro_left + + Breasts/breasts_huge_left + Breasts/breasts_huge_left + Breasts/breasts_large_left + Breasts/breasts_average_left + Breasts/breasts_small_left + Breasts/breasts_micro_left + + + + + Breasts/breasts_scalie_micro_left + + Breasts/breasts_scalie_huge_left + Breasts/breasts_scalie_huge_left + Breasts/breasts_scalie_large_left + Breasts/breasts_scalie_average_left + Breasts/breasts_scalie_small_left + Breasts/breasts_scalie_micro_left + + + + + Breasts/breasts_micro_left + + Breasts/breasts_huge_left + Breasts/breasts_huge_left + Breasts/breasts_large_left + Breasts/breasts_average_left + Breasts/breasts_small_left + Breasts/breasts_micro_left + + + + + Breasts/Ghost/breasts_micro_left + + Breasts/Ghost/breasts_huge_left + Breasts/Ghost/breasts_huge_left + Breasts/Ghost/breasts_large_left + Breasts/Ghost/breasts_average_left + Breasts/Ghost/breasts_small_left + Breasts/Ghost/breasts_micro_left + + + + + Breasts/breasts_micro_left + + Breasts/breasts_huge_left + Breasts/breasts_huge_left + Breasts/breasts_large_left + Breasts/breasts_average_left + Breasts/breasts_small_left + Breasts/breasts_micro_left + + + + + + + (-0.3878,0.00) + + + + + (-0.6478,0.00) + + + + + (-0.628,0.036) + + + + +
  • + Breasts/FeaturelessRight + true + .70 + Chest + Transparent + true + -0.2765 + +
  • Torso
  • + + false + + + + + Breasts/breasts_micro_right + + Breasts/breasts_huge_right + Breasts/breasts_huge_right + Breasts/breasts_large_right + Breasts/breasts_average_right + Breasts/breasts_small_right + Breasts/breasts_micro_right + + + + + + + Breasts/breasts_hyd_micro_right + + Breasts/breasts_hyd_huge_right + Breasts/breasts_hyd_huge_right + Breasts/breasts_hyd_large_right + Breasts/breasts_hyd_right + Breasts/breasts_hyd_small_right + Breasts/breasts_hyd_micro_right + + + + + Breasts/breasts_bio_micro_right + + Breasts/breasts_bio_huge_right + Breasts/breasts_bio_huge_right + Breasts/breasts_bio_large_right + Breasts/breasts_bio_right + Breasts/breasts_bio_small_right + Breasts/breasts_bio_micro_right + + + + + Breasts/Bionics/breasts_arc_micro_right + + Breasts/Bionics/breasts_arc_huge_right + Breasts/Bionics/breasts_arc_huge_right + Breasts/Bionics/breasts_arc_large_right + Breasts/Bionics/breasts_arc_right + Breasts/Bionics/breasts_arc_small_right + Breasts/Bionics/breasts_arc_micro_right + + + Injuries/breasts_missing_right + + + + Breasts/breasts_micro_right + + Breasts/breasts_huge_right + Breasts/breasts_huge_right + Breasts/breasts_large_right + Breasts/breasts_average_right + Breasts/breasts_small_right + Breasts/breasts_micro_right + + + + + Breasts/breasts_micro_right + + Breasts/breasts_huge_right + Breasts/breasts_huge_right + Breasts/breasts_large_right + Breasts/breasts_average_right + Breasts/breasts_small_right + Breasts/breasts_micro_right + + + + + Breasts/breasts_scalie_micro_right + + Breasts/breasts_scalie_huge_right + Breasts/breasts_scalie_huge_right + Breasts/breasts_scalie_large_right + Breasts/breasts_scalie_average_right + Breasts/breasts_scalie_small_right + Breasts/breasts_scalie_micro_right + + + + + Breasts/breasts_micro_right + + Breasts/breasts_huge_right + Breasts/breasts_huge_right + Breasts/breasts_large_right + Breasts/breasts_average_right + Breasts/breasts_small_right + Breasts/breasts_micro_right + + + + + Breasts/Ghost/breasts_micro_right + + Breasts/Ghost/breasts_huge_right + Breasts/Ghost/breasts_huge_right + Breasts/Ghost/breasts_large_right + Breasts/Ghost/breasts_average_right + Breasts/Ghost/breasts_small_right + Breasts/Ghost/breasts_micro_right + + + + + Breasts/breasts_micro_right + + Breasts/breasts_huge_right + Breasts/breasts_huge_right + Breasts/breasts_large_right + Breasts/breasts_average_right + Breasts/breasts_small_right + Breasts/breasts_micro_right + + + + + + + (-0.407,0.00) + + + + + (-0.667,0.00) + + + + + (-0.628,0.036) + + + + + + +
    +
    +
    +
    + diff --git a/changelog.txt b/changelog.txt index 324eaf8..bb09c30 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,9 @@ +ver 2.2.15.7 Unofficial +- Updated Androids patch +- Added Snake Race patch (nighzmarquls) + ver 2.2.15.6 Unofficial -Updated IDs for Race Support and FemaleBB (Thanks Azylon) +- Updated IDs for Race Support and FemaleBB (Thanks Azylon) ver 2.2.15.5 Unofficial - Updated Orassan patch (Linda Redbloom) From 17c25c8bfdd59586c45233774295a1f8459683c4 Mon Sep 17 00:00:00 2001 From: SJKincade <39523-sjkincade@users.noreply.gitgud.io> Date: Sun, 1 Jan 2023 23:11:05 +0000 Subject: [PATCH 2/4] RevealingApparel Postfix Of VisibleUnderApparelOf --- .../1.4 Assembly/Assemblies/RimNudeWorld.dll | Bin 33792 -> 29696 bytes .../RimNudeWorld/patches/RevealingApparel.cs | 285 ++++-------------- 2 files changed, 67 insertions(+), 218 deletions(-) diff --git a/Assembly Folders/1.4 Assembly/Assemblies/RimNudeWorld.dll b/Assembly Folders/1.4 Assembly/Assemblies/RimNudeWorld.dll index 78028a37d29b0a45186f4aad889c396ec03f8068..80f47b84189db0d01361ca78b7494c13a655766e 100644 GIT binary patch literal 29696 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 J|CcoI{{TA)b5j5S literal 33792 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

    =(+ReujUOPDsMtZTNBa*I_bX3ya zk`76V5S!;Y=De9fo@d>J+rz7-8SuMZvQTqXgsX5IQ0r3gD|i0j4+Sf1lDBSy7C+PAXQ#=z5=WC+joLrXZ(Qp^;s_?^vC8_vG78k|QFs|is<%OgCEyj*` zYDo%5*&e>WulC>L;1% z0h2CskhdT3TOj_GTVL@@-_|`vG+YcUya`_Dv6yC4^WWCh3#_X|+%MtUKN`;c)}ug< z|L7h5dw+6$3m3-b_s?I@(%w2R-rUxHp+(wyY4Gn#yT=?7T-IPn|E^V3Vv#-tqW5Ga-t@G2mvg>Al~UiiYv?qQW@;kIcp)Z<5K>>@W1E@K(UzxjUF2 zC%uEjUcT@tEo3FvhTom$KASin&Xp!VyNmE}YL5BTolLI9`z+?Kp5k$NA(q>`I}T2UFg8%>dzpMfCH`e$gH{+89;oyM?>-I@- z##@E&`F9a5MsT0|EVj)<_FUSG!`E|h=)VcM)%dmVI+XD%J{$qB7u4_Ae|Ma(^~^7W zI1giy)cmcpYUOi}Ze$ct*V;Q$vpkl&yy)|C-o@tBuZLKxR(tgGC067$F9Huy7M z?$e3Clc(hQ@sWQ9*Bg8RX5Q$^bqSE)>oS4qG$XDn&^Q+~`0moWYC(Mq?sl8=U&8LD#dink>Ue?zIICE@&EyZ^*LMQUT^W>1Ape68!IlEn*CekUnF|p09t%! zJR%p21r7Xlea{npPi}jn)=$)Vo3!abZ}@tMZCqtg diff --git a/Source/RimNudeWorld/RimNudeWorld/patches/RevealingApparel.cs b/Source/RimNudeWorld/RimNudeWorld/patches/RevealingApparel.cs index b892ddf..1381fe4 100644 --- a/Source/RimNudeWorld/RimNudeWorld/patches/RevealingApparel.cs +++ b/Source/RimNudeWorld/RimNudeWorld/patches/RevealingApparel.cs @@ -1,253 +1,102 @@ using AlienRace; +using AlienRace.ExtendedGraphics; using HarmonyLib; using RimWorld; -using System; using System.Collections.Generic; using System.Linq; -using UnityEngine; using Verse; - +// The RevealingApparel mod extension allows us to add information to apparel that tells us if wearing an apparel item +// should also cover the body parts introduced by RNW. This way mod authors can make an apparel item that covers a pawn's +// torso but still draws their breasts or genitals. namespace RevealingApparel { - - - //[StaticConstructorOnStartup] - // public static class HarmonyPatching - // { - - // static HarmonyPatching() - // { - // Harmony harmony = new Harmony("RevealingApparel"); - // harmony.PatchAll(); - // } - // } - - - - - + // This is the mod extension that people will use to add revealing information to their apparel defs. public class ApparelRevealingExtension : DefModExtension { + // A list of RevealingExtensionEntry items, which describe what body parts are revealed when a pawn is wearing this apparel item public List revealingBodyPartEntries = new List(); - - public ApparelRevealingExtension() - { - - } - } + // The entry class that describes what body parts are revealed public class RevealingExtensionEntry { + // The path to the body part that is revealed. + // Examples include "Breasts/FeaturelessLeft" or "Genitals/FeaturelessCrotch" + public string revealingPath; - public String revealingPath; + // A list of pawn body types this entry applies to. + // Examples include "Female" or "Thin" or "Hulk" public List revealingBodyTypes = new List(); - - } - - - - - public static class RevealingApparel + // We are going to postfix patch the VisibleUnderApparelOf check in HAR so we can make body parts visible if all of the apparel + // covering it is marked as revealing + [HarmonyPatch(typeof(AlienPartGenerator.BodyAddon), "VisibleUnderApparelOf")] + class HarmonyPatch_RevealingApparel_VisibleUnderApparelOf { - public static bool CanDrawRevealing(AlienPartGenerator.BodyAddon bodyAddon, Pawn pawn) + public static Pawn GetPawnFromWrapped(ExtendedGraphicsPawnWrapper pawn) { - // the below 2 conditions are added by CnArmor in attempt to fix conflict with MoHAR. - if (pawn.apparel.WornApparel != null && pawn.apparel.WornApparel.Count == 0) //no need to bother if pawn is naked - return false; - - //if body addon is not mentioned in that list, don't bother - bool bodyAddonMentioned = false; - if(pawn.apparel.WornApparel != null) - { - for(int i = 0; i < pawn.apparel.WornApparel.Count; i++) - { - Apparel apparel = pawn.apparel.WornApparel[i]; - ApparelRevealingExtension ARE = apparel.def.GetModExtension(); - if (ARE != null && ARE.revealingBodyPartEntries.Any((RevealingExtensionEntry ree) => (bodyAddon.path == ree.revealingPath))) - { - bodyAddonMentioned = true; - break; - } - } - if (bodyAddonMentioned == false) - return false; - } - // the above 2 conditions are added by CnArmor in attempt to fix conflict with MoHAR. I didn't dare to touch the original code below because of complexity. - - BodyTypeDef pawnBodyDef = pawn.story.bodyType; - - if (!(pawn.apparel.WornApparel == null) && - - pawn.apparel.WornApparel.Where((Apparel ap) //First fetching everything that covers the bodypart - => ap.def.apparel.bodyPartGroups.Any((BodyPartGroupDef bpgd) - => bodyAddon.hiddenUnderApparelFor.Contains(bpgd)) - || ap.def.apparel.tags.Any((string s) => bodyAddon.hiddenUnderApparelTag.Contains(s))) - - - .All((Apparel ap) //Then checking that list, if everything has the revealing flag for the current body, reveal - => (ap.def.GetModExtension()?.revealingBodyPartEntries.Any((RevealingExtensionEntry revealingExtensionEntry) - => (bodyAddon.path.Contains(revealingExtensionEntry.revealingPath) && revealingExtensionEntry.revealingBodyTypes.Any((BodyTypeDef revealingBodyType) => pawnBodyDef.defName.Contains(revealingBodyType.defName)))) - ?? false - - ))) - { - - Building_Bed building_Bed = pawn.CurrentBed(); - - if ((building_Bed == null || building_Bed.def.building.bed_showSleeperBody || bodyAddon.drawnInBed) && (bodyAddon.backstoryRequirement == null || pawn.story.AllBackstories.Any((BackstoryDef b) => b.identifier == bodyAddon.backstoryRequirement.identifier))) - { - if (!bodyAddon.drawnDesiccated) - { - Corpse corpse = pawn.Corpse; - if (corpse != null && corpse.GetRotStage() == RotStage.Dessicated) - { - return false; - - } - } - if (bodyAddon.bodyPart != null && !pawn.health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined, null, null).Any((BodyPartRecord bpr) => bpr.untranslatedCustomLabel == bodyAddon.bodyPart.label || bpr.def.defName == bodyAddon.bodyPart.label)) - { - List list = bodyAddon.hediffGraphics; - bool flag; - if (list == null) - { - flag = false; - } - else - { - flag = list.Any((AlienPartGenerator.ExtendedHediffGraphic bahg) => bahg.hediff == HediffDefOf.MissingBodyPart); - } - if (!flag) - { - return false; - } - } - if ((pawn.gender == Gender.Female) ? bodyAddon.drawForFemale : bodyAddon.drawForMale) - { - //return bodyAddon.bodyTypeRequirement.NullOrEmpty() || pawn.story.bodyType.ToString() == bodyAddon.bodyTypeRequirement; - return bodyAddon.bodytypeGraphics.NullOrEmpty() || pawn.story.bodyType == bodyAddon.bodyTypeRequirement; - } - } - } - return false; + // The pawn wrapper doesn't expose the original Pawn as a public field, so we need to use reflection + // to pull it out. + return Traverse.Create(pawn).Property("WrappedPawn").GetValue(); } - - - } - - [HarmonyPatch(typeof(AlienRace.HarmonyPatches), "DrawAddons")] - class HarmonyPatch_DrawAddons - { - - - //[TweakValue("AAAInfrontAAAAAAAAtittyoffset", -0.1f, 0.1f)] - private static float underClothingOffset = 0.0136f; - //[TweakValue("AAABehindAAAAAAAAtittyoffset", -0.2f, 0.0f)] - //private static float Behind = -0.1f; - - - public static void Postfix(PawnRenderFlags renderFlags, Vector3 vector, Vector3 headOffset, Pawn pawn, Quaternion quat, Rot4 rotation) + public static IEnumerable GetApparelCoveringPart(Pawn pawn, AlienPartGenerator.BodyAddon bodyAddon) { - - ThingDef_AlienRace thingDef_AlienRace = pawn.def as ThingDef_AlienRace; - if (thingDef_AlienRace == null || renderFlags.FlagSet(PawnRenderFlags.Invisible)) - { - //Log.Message(pawn.def.defName); - if (pawn.def.defName == "Human") - { - //Log.Message(pawn.def.defName); - } - return; - } - - - - - - Building_Bed building_Bed = pawn.CurrentBed(); - - List bodyAddons = thingDef_AlienRace.alienRace.generalSettings.alienPartGenerator.bodyAddons; - AlienPartGenerator.AlienComp comp = pawn.GetComp(); - - for (int i = 0; i < bodyAddons.Count; i++) - { - AlienPartGenerator.BodyAddon bodyAddon = bodyAddons[i]; - if (!bodyAddon.CanDrawAddon(pawn) && RevealingApparel.CanDrawRevealing(bodyAddon, pawn)) //No need to draw twice - { - - - pawn.apparel.WornApparel.Any((Apparel ap) - => ap.def.apparel.bodyPartGroups.Any((BodyPartGroupDef bpgd) - => bodyAddon.hiddenUnderApparelFor.Contains(bpgd))); - - - - AlienPartGenerator.RotationOffset offset = bodyAddon.defaultOffsets.GetOffset(rotation); - Vector3 a = (offset != null) ? offset.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, pawn.story.headType) : Vector3.zero; - AlienPartGenerator.RotationOffset offset2 = bodyAddon.offsets.GetOffset(rotation); - Vector3 vector2 = a + ((offset2 != null) ? offset2.GetOffset(renderFlags.FlagSet(PawnRenderFlags.Portrait), pawn.story.bodyType, pawn.story.headType) : Vector3.zero); - - - vector2.y = (bodyAddon.inFrontOfBody ? (0.3f + vector2.y - underClothingOffset) : (-0.3f - vector2.y + underClothingOffset)); - - // Log.Message(pawn.def.defName +" "+ bodyAddon.path + " has vector2.y " + vector2.y + "Default offset: " + bodyAddon.defaultOffsets.GetOffset(rotation).layerOffset); - - if (bodyAddon.inFrontOfBody && vector2.y < 0f) //The offset of some bodyaddons is too far out of the "over body, under clothes"-range, e.g. OTY bellies. - { - vector2.y = 0.01f; - } - // Log.Message(pawn.def.defName + " " + bodyAddon.path + " has now vector2.y " + vector2.y + "Default offset: " + bodyAddon.defaultOffsets.GetOffset(rotation).layerOffset); - - float num = bodyAddon.angle; - if (rotation == Rot4.North) - { - if (bodyAddon.layerInvert) - { - vector2.y = -vector2.y; - vector2.y -= underClothingOffset * 2; //I am not sure why I am doing this, but it puts Anus under the pants layer. - } - num = 0f; - } - - - if (rotation == Rot4.East) - { - num = -num; - vector2.x = -vector2.x; - } - - Vector3 outputVector = vector + (bodyAddon.alignWithHead ? headOffset : Vector3.zero) + vector2.RotatedBy(Mathf.Acos(Quaternion.Dot(Quaternion.identity, quat)) * 2f * 57.29578f); - - - Graphic graphic = comp.addonGraphics[i]; - graphic.drawSize = ((renderFlags.FlagSet(PawnRenderFlags.Portrait) && bodyAddon.drawSizePortrait != Vector2.zero) ? bodyAddon.drawSizePortrait : bodyAddon.drawSize) * (bodyAddon.scaleWithPawnDrawsize ? (bodyAddon.alignWithHead ? (renderFlags.FlagSet(PawnRenderFlags.Portrait) ? comp.customPortraitHeadDrawSize : comp.customHeadDrawSize) : (renderFlags.FlagSet(PawnRenderFlags.Portrait) ? comp.customPortraitDrawSize : comp.customDrawSize)) : Vector2.one) * 1.5f; - GenDraw.DrawMeshNowOrLater( - graphic.MeshAt(rotation), - outputVector, - Quaternion.AngleAxis(num, Vector3.up) * quat, - graphic.MatAt(rotation, null), - renderFlags.FlagSet(PawnRenderFlags.DrawNow)); - } - - - } - - //return true; - - + // Get a list of all of the apparel worn by this pawn + return pawn.apparel?.WornApparel?.Where( + // Where any of the body part groups this apparel covers + apparel => apparel.def.apparel.bodyPartGroups.Any( + // Hide the passed body addon + bodyPartGroup => bodyAddon.hiddenUnderApparelFor.Contains(bodyPartGroup))); } + public static bool IsApparelRevealingBodyPart(Apparel apparel, AlienPartGenerator.BodyAddon bodyAddon, BodyTypeDef bodyType) + { + // Get the revealing entries for this apparel item + var revealingExtension = apparel.def.GetModExtension(); + // And return if one of these entries matches the body part for this pawn body type + return revealingExtension?.revealingBodyPartEntries.Any((entry) => + { + // Does this entry reveal the body part we are considering + bool entryMatchesBodyPart = entry.revealingPath?.Contains(bodyAddon.GetPath()) ?? false; + // Does this entry apply to the pawn's body shape + bool entryMatchesPawnBody = entry.revealingBodyTypes?.Contains(bodyType) ?? false; + // If this entry matches the part and applies to the pawn body type, then this apparel reveals this body part + return entryMatchesBodyPart && entryMatchesPawnBody; + }) ?? false; // If there are no revealing body part entries, then this apparel covers this body part + } + + public static bool Postfix(bool __result, AlienPartGenerator.BodyAddon __instance, ExtendedGraphicsPawnWrapper pawn) + { + // If the original method returned false, we might still show it based on the revealing apparel entries + if (__result == false) + { + // Grab the underlying pawn from the wrapped version we were passed + var myPawn = GetPawnFromWrapped(pawn); + + // Reference the pawn body type. We will need this to know if revealing body part entries apply to this pawn + var bodyType = myPawn.story.bodyType; + + // Get a list of all of the apparel worn by this pawn that covers this body part + var apparelCoveringPartList = GetApparelCoveringPart(myPawn, __instance); + + // If no apparel is covering this part OR they are all revealing, then reveal this body part + if (apparelCoveringPartList.Count() == 0 || + apparelCoveringPartList.All(apparel => IsApparelRevealingBodyPart(apparel, __instance, bodyType))) { + return true; + } + } + + // Else, return the original result + return __result; + } } - } From 7af313fde4abf5bb76baa0831a2b207d5414d601 Mon Sep 17 00:00:00 2001 From: Tory <22203-Tory@users.noreply.gitgud.io> Date: Sun, 1 Jan 2023 23:13:10 +0000 Subject: [PATCH 3/4] 2.2.15.8 --- About/Manifest.xml | 2 +- changelog.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/About/Manifest.xml b/About/Manifest.xml index 0512269..6fda52a 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,6 +1,6 @@ - 2.2.15.7 + 2.2.15.8 https://gitgud.io/Tory/rimnude-unofficial/-/raw/master/About/Manifest.xml https://gitgud.io/Tory/rimnude-unofficial/ diff --git a/changelog.txt b/changelog.txt index bb09c30..6a709dc 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +ver 2.2.15.8 Unofficial +- Updated Revealing Apparel code (sjkincade) + ver 2.2.15.7 Unofficial - Updated Androids patch - Added Snake Race patch (nighzmarquls) From 1ae8bcc9e692d3668eef68ba43f04a1cca54de9a Mon Sep 17 00:00:00 2001 From: Tory <22203-Tory@users.noreply.gitgud.io> Date: Thu, 5 Jan 2023 08:22:41 +0000 Subject: [PATCH 4/4] Update LoadFolders.xml --- LoadFolders.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/LoadFolders.xml b/LoadFolders.xml index 7ca8111..ea8cd1d 100644 --- a/LoadFolders.xml +++ b/LoadFolders.xml @@ -1,14 +1,14 @@ - + -

  • Extra Patches/Debug Patch
  • +
  • Extra Patches/Debug Patch
  • Extra Patches/1.1 Colored Nudes
  • Common
  • Assembly Folders/1.1 and 1.2 Assembly
  • -
  • Extra Patches/Debug Patch
  • +
  • Extra Patches/Debug Patch
  • Extra Patches/1.2 Plus Colored Nudes
  • Common
  • @@ -18,7 +18,7 @@
  • Extra Patches/1.3 Offset Patch
  • Extra Patches/Revealing Apparel
  • -
  • Extra Patches/Debug Patch
  • +
  • Extra Patches/Debug Patch
  • Extra Patches/1.2 Plus Colored Nudes
  • Common
  • Assembly Folders/1.3 Assembly
  • @@ -27,9 +27,9 @@
  • Extra Patches/1.3 Offset Patch
  • Extra Patches/Revealing Apparel
  • -
  • Extra Patches/Debug Patch
  • +
  • Extra Patches/Debug Patch
  • Extra Patches/1.2 Plus Colored Nudes
  • Common
  • Assembly Folders/1.4 Assembly
  • - \ No newline at end of file +