Jump to content

[mod] ESeeker RJW Forks & Additions


ESeeker

Recommended Posts

Posted (edited)
On 9/28/2025 at 4:56 AM, ESeeker said:

in all my mods/forks (excluding Slime) there is a debug setting, on startup it will log all patches by said mod/fork(both first and last part are always logged)

[mod name] <TIME> Initializing...

[mod name] X patched

[mod name] Done (if this isn't in log it means a patch failed)

for Apparel Tweaks: (7 patches)"RJW patched", (2 patches)"PawnRenderTree patched",

"RJW Events patched"(needs said mod), "Rimnude unpatched"(needs said mod), (2 patches)"Holster patched"(needs said mod)

rimworld should throw an error if patch fails, this debug info will tell me where

 

I did more testing with debug messages activated, and what is causing the null reference exception is the Holsters mod:

 

Spoiler
  • [RJW Apparel Tweaks] 10/1/2025 1:46:29 PM: Initializing...
  • [RJW Apparel Tweaks] 10/1/2025 1:46:29 PM: RJW patched
  • [RJW Apparel Tweaks] 10/1/2025 1:46:29 PM: PawnRenderTree patched
  • [RJW Apparel Tweaks] 10/1/2025 1:46:29 PM: RJW Events patched
  • Error in static constructor of AbsCon_Apparel_Settings_For_RJW.Harmony_PatchAll: System.TypeInitializationException: The type initializer for 'AbsCon_Apparel_Settings_For_RJW.Harmony_PatchAll' threw an exception. ---> System.NullReferenceException: Null method for Abscon_Apparel_Settings_For_RJW
  • [Ref A2685571]
  •   at HarmonyLib.PatchProcessor.Patch () [0x0001d] in <e53399289d9b419d83f9f5b02c5cf609>:0 
  •   at HarmonyLib.Harmony.Patch (System.Reflection.MethodBase original, HarmonyLib.HarmonyMethod prefix, HarmonyLib.HarmonyMethod postfix, HarmonyLib.HarmonyMethod transpiler, HarmonyLib.HarmonyMethod finalizer) [0x0002a] in <e53399289d9b419d83f9f5b02c5cf609>:0 
  • AbsCon_Apparel_Settings_For_RJW.Harmony_PatchAll..cctor()
  •    --- End of inner exception stack trace ---
  • [Ref 319773C0]
  • (wrapper managed-to-native) System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(intptr)
  •   at System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (System.RuntimeTypeHandle type) [0x0002a] in <51fded79cd284d4d911c5949aff4cb21>:0 
  •   at Verse.StaticConstructorOnStartupUtility.CallAll () [0x00025] in <545b26faba1c49b798d4efe7362d2e92>:0 

 

Also, I noticed that loading just Apparel Tweaks with RJW will throw an error about Equal Milking, and if you load EM then it will complain about RJW-Events, not even showing the "Initializing..." log. When you load the 4, no problem.

 

About the Core button, with just Apparel Tweaks + relevant mods loaded it works fine, so I'm going to guess that I was just impatient and didn't give it enough time to load all the mods with apparels I have.

Edited by RurouniCoder
Posted
6 hours ago, RurouniCoder said:

 

I did more testing with debug messages activated, and what is causing the null reference exception is the Holsters mod:

 

  Reveal hidden contents
  • [RJW Apparel Tweaks] 10/1/2025 1:46:29 PM: Initializing...
  • [RJW Apparel Tweaks] 10/1/2025 1:46:29 PM: RJW patched
  • [RJW Apparel Tweaks] 10/1/2025 1:46:29 PM: PawnRenderTree patched
  • [RJW Apparel Tweaks] 10/1/2025 1:46:29 PM: RJW Events patched
  • Error in static constructor of AbsCon_Apparel_Settings_For_RJW.Harmony_PatchAll: System.TypeInitializationException: The type initializer for 'AbsCon_Apparel_Settings_For_RJW.Harmony_PatchAll' threw an exception. ---> System.NullReferenceException: Null method for Abscon_Apparel_Settings_For_RJW
  • [Ref A2685571]
  •   at HarmonyLib.PatchProcessor.Patch () [0x0001d] in <e53399289d9b419d83f9f5b02c5cf609>:0 
  •   at HarmonyLib.Harmony.Patch (System.Reflection.MethodBase original, HarmonyLib.HarmonyMethod prefix, HarmonyLib.HarmonyMethod postfix, HarmonyLib.HarmonyMethod transpiler, HarmonyLib.HarmonyMethod finalizer) [0x0002a] in <e53399289d9b419d83f9f5b02c5cf609>:0 
  • AbsCon_Apparel_Settings_For_RJW.Harmony_PatchAll..cctor()
  •    --- End of inner exception stack trace ---
  • [Ref 319773C0]
  • (wrapper managed-to-native) System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(intptr)
  •   at System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (System.RuntimeTypeHandle type) [0x0002a] in <51fded79cd284d4d911c5949aff4cb21>:0 
  •   at Verse.StaticConstructorOnStartupUtility.CallAll () [0x00025] in <545b26faba1c49b798d4efe7362d2e92>:0 

 

Also, I noticed that loading just Apparel Tweaks with RJW will throw an error about Equal Milking, and if you load EM then it will complain about RJW-Events, not even showing the "Initializing..." log. When you load the 4, no problem.

 

About the Core button, with just Apparel Tweaks + relevant mods loaded it works fine, so I'm going to guess that I was just impatient and didn't give it enough time to load all the mods with apparels I have.

Equal Milking: compatibility was done rather hastily result first missing end tag(invalid XML) then continuously forgeting to add MayRequire

Holster: 1.6 version on github lacks source code(only 1.3-1.4 has) meaning I ended up patching outdated code

RJW Events: me & original creator have different approaches for harmony patches

Posted
16 hours ago, ESeeker said:

Equal Milking: compatibility was done rather hastily result first missing end tag(invalid XML) then continuously forgeting to add MayRequire

Holster: 1.6 version on github lacks source code(only 1.3-1.4 has) meaning I ended up patching outdated code

RJW Events: me & original creator have different approaches for harmony patches

 

Have you tried to decompile Holsters 1.6 assembly? Not as good as having the source code, but a close second.

Posted (edited)

Error testing FamilyOverhaul 1.8.3
https://gist.github.com/HugsLibRecordKeeper/78992997d7547a8a40ceca2125e0d4a5

I can't even start a test run.
Android.cs is still dependent on VREAndroid.dll because of if (VREAndroids.Utils.IsAndroid(p). Copy the code I posted. Despite being inside an if that checks if the mod is installed, the game wants all the pieces before start running the function and it fails when it can't find VREAndroids.Utils.IsAndroid(p).

Edit: After change the code I found another error.
https://gist.github.com/HugsLibRecordKeeper/b7dac1e86cb57564651c3de699cab896
This time I tried to view a slave's statistics. Everything was empty; no statistics appeared.
The problems are TransformValue and ExplanationPart, you can't send req.Pawn to ValueFor, you have to use it like in ActiveFor and make req.Thing as a Pawn input, like this:

Spoiler
TransformValue(StatRequest req, ref float val)
        {
            if (ActiveFor(req.Thing))
            {
                if (req.Thing is Pawn pawn) 
                {
                  val *= ValueFor(pawn);  
                }
            }
        }

public override string ExplanationPart(StatRequest req)
{
    if (req.HasThing && ActiveFor(req.Thing))
    {
        if (req.Thing is Pawn pawn)
        {
            return "StatsReport_Slave".Translate() + (": x" + ValueFor(pawn).ToStringPercent());
        }        
    }
    return null;
}

 

 

Edited by furel
More bugs
Posted

Was trying to trade and family overhaul prevented me from doing so. 
Error: 

Spoiler

JobDriver threw exception in toil MakeNewToils's initAction for pawn Sam driver=JobDriver_TradeWithPawn (toilIndex=1) driver.job=(TradeWithPawn (Job_1964697) A = Thing_OG_Alien_Tau452471 Giver = ThinkNode_QueuedJob [workGiverDef: null]) System.NullReferenceException: Object reference not set to an instance of an object [Ref 173547E8] at FamilyOverhaul.Comp_FamilyData.get_HasMaster () [0x000e8] in <450b289196a04794903f38dceb8cf8f3>:0 at FamilyOverhaul.Family.PreventSellingPersonal_Patch (System.Boolean& __result, Verse.Pawn __instance, System.String& reason) [0x00015] in <450b289196a04794903f38dceb8cf8f3>:0 at Verse.Pawn.PreventPlayerSellingThingsNearby (System.String& reason) [0x00016] in <24d25868955f4df08b02c73b55f389fe>:0 - PREFIX ESeeker.FO: Boolean FamilyOverhaul.Family:PreventSellingPersonal_Patch(Boolean& __result, Pawn __instance, String& reason) at RimWorld.TradeDeal.InSellablePosition (Verse.Thing t, System.String& reason) [0x00136] in <24d25868955f4df08b02c73b55f389fe>:0 - PREFIX com.spdskatr.projectrimfactory: Boolean ProjectRimFactory.Common.HarmonyPatches.Patch_TradeDeal_InSellablePosition:Prefix(Thing t, String& reason, Boolean& __result) - POSTFIX SmashPhil.VehicleFramework: Void Vehicles.Patch_CaravanHandling:NegotiatorInVehicle(Boolean& __result) at RimWorld.TradeDeal.AddAllTradeables () [0x00037] in <24d25868955f4df08b02c73b55f389fe>:0 at RimWorld.TradeDeal.Reset () [0x00016] in <24d25868955f4df08b02c73b55f389fe>:0 RimWorld.TradeDeal..ctor() at RimWorld.TradeSession.SetupWith (RimWorld.ITrader newTrader, Verse.Pawn newPlayerNegotiator, System.Boolean giftMode) [0x00024] in <24d25868955f4df08b02c73b55f389fe>:0 RimWorld.Dialog_Trade..ctor(Pawn playerNegotiator, ITrader trader, Boolean giftsOnly) at RimWorld.JobDriver_TradeWithPawn+<>c__DisplayClass3_0.<MakeNewToils>b__1 () [0x0002f] in <24d25868955f4df08b02c73b55f389fe>:0 at Verse.AI.JobDriver.TryActuallyStartNextToil () [0x001b0] in <24d25868955f4df08b02c73b55f389fe>:0 UnityEngine.StackTraceUtility:ExtractStackTrace () (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Log.Error_Patch3 (string) (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.AI.JobUtility.TryStartErrorRecoverJob_Patch1 (Verse.Pawn,string,System.Exception,Verse.AI.JobDriver) Verse.AI.JobDriver:TryActuallyStartNextToil () Verse.AI.JobDriver:ReadyForNextToil () Verse.AI.JobDriver:Notify_PatherArrived () Verse.AI.Pawn_PathFollower:PatherArrived () (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.AI.Pawn_PathFollower.TryEnterNextPathCell_Patch1 (Verse.AI.Pawn_PathFollower) (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.AI.Pawn_PathFollower.PatherTick_Patch2 (Verse.AI.Pawn_PathFollower) (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Pawn.Tick_Patch4 (Verse.Pawn) Verse.Thing:DoTick () Verse.TickList:Tick () (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.TickManager.DoSingleTick_Patch3 (Verse.TickManager) Verse.TickManager:TickManagerUpdate () (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Game.UpdatePlay_Patch4 (Verse.Game) Verse.Root_Play:Update ()

I believe I managed to fix it. 


The issue is with HasMaster. I opened the mod in Visual Studio and added a null check to it:
Before:

Spoiler

public bool HasMaster
{
    get
    {
        return parentPawn.relations.GetFirstDirectRelationPawn(PawnRelationDefOf.Master) != null;
    }
}
 

After:
 

Spoiler

public bool HasMaster
{
    get
    {
        if (parentPawn == null) return false;
        if (parentPawn.relations == null) return false;
        return parentPawn.relations.GetFirstDirectRelationPawn(PawnRelationDefOf.Master) != null;
    }
}
 


And then fixed the PreventSellingPersonal_Patch inside of Family.cs

Before:

Spoiler

public static bool PreventSellingPersonal_Patch(ref bool __result, Pawn __instance, ref string reason)
{
    if (__instance.GetComp<Comp_FamilyData>().HasMaster)
    {
        __result = true;
        reason = "Cannot sell a pawn with a master.";
        return false;
    }
    return true;
}
 

After:
 

Spoiler

public static bool PreventSellingPersonal_Patch(ref bool __result, Pawn __instance, ref string reason)
{
    var comp = __instance?.GetComp<Comp_FamilyData>();
    if (comp != null && comp.HasMaster)
    {
        __result = true;
        reason = "Cannot sell a pawn with a master.";
        return false;
    }
    return true;
}
 

I'm not sure if this will cause me any issues down the line but the mod was calling for .HasMaster without checking if they had a Compy_FamilyData component and was getting the above exception.... I'm not sure whether or not my pawn was supposed to have a Comp_FamilyData component, but they are neither a master or under a master.

Posted
22 hours ago, SecretAgentClank said:

Was trying to trade and family overhaul prevented me from doing so. 
Error: 

  Reveal hidden contents

JobDriver threw exception in toil MakeNewToils's initAction for pawn Sam driver=JobDriver_TradeWithPawn (toilIndex=1) driver.job=(TradeWithPawn (Job_1964697) A = Thing_OG_Alien_Tau452471 Giver = ThinkNode_QueuedJob [workGiverDef: null]) System.NullReferenceException: Object reference not set to an instance of an object [Ref 173547E8] at FamilyOverhaul.Comp_FamilyData.get_HasMaster () [0x000e8] in <450b289196a04794903f38dceb8cf8f3>:0 at FamilyOverhaul.Family.PreventSellingPersonal_Patch (System.Boolean& __result, Verse.Pawn __instance, System.String& reason) [0x00015] in <450b289196a04794903f38dceb8cf8f3>:0 at Verse.Pawn.PreventPlayerSellingThingsNearby (System.String& reason) [0x00016] in <24d25868955f4df08b02c73b55f389fe>:0 - PREFIX ESeeker.FO: Boolean FamilyOverhaul.Family:PreventSellingPersonal_Patch(Boolean& __result, Pawn __instance, String& reason) at RimWorld.TradeDeal.InSellablePosition (Verse.Thing t, System.String& reason) [0x00136] in <24d25868955f4df08b02c73b55f389fe>:0 - PREFIX com.spdskatr.projectrimfactory: Boolean ProjectRimFactory.Common.HarmonyPatches.Patch_TradeDeal_InSellablePosition:Prefix(Thing t, String& reason, Boolean& __result) - POSTFIX SmashPhil.VehicleFramework: Void Vehicles.Patch_CaravanHandling:NegotiatorInVehicle(Boolean& __result) at RimWorld.TradeDeal.AddAllTradeables () [0x00037] in <24d25868955f4df08b02c73b55f389fe>:0 at RimWorld.TradeDeal.Reset () [0x00016] in <24d25868955f4df08b02c73b55f389fe>:0 RimWorld.TradeDeal..ctor() at RimWorld.TradeSession.SetupWith (RimWorld.ITrader newTrader, Verse.Pawn newPlayerNegotiator, System.Boolean giftMode) [0x00024] in <24d25868955f4df08b02c73b55f389fe>:0 RimWorld.Dialog_Trade..ctor(Pawn playerNegotiator, ITrader trader, Boolean giftsOnly) at RimWorld.JobDriver_TradeWithPawn+<>c__DisplayClass3_0.<MakeNewToils>b__1 () [0x0002f] in <24d25868955f4df08b02c73b55f389fe>:0 at Verse.AI.JobDriver.TryActuallyStartNextToil () [0x001b0] in <24d25868955f4df08b02c73b55f389fe>:0 UnityEngine.StackTraceUtility:ExtractStackTrace () (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Log.Error_Patch3 (string) (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.AI.JobUtility.TryStartErrorRecoverJob_Patch1 (Verse.Pawn,string,System.Exception,Verse.AI.JobDriver) Verse.AI.JobDriver:TryActuallyStartNextToil () Verse.AI.JobDriver:ReadyForNextToil () Verse.AI.JobDriver:Notify_PatherArrived () Verse.AI.Pawn_PathFollower:PatherArrived () (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.AI.Pawn_PathFollower.TryEnterNextPathCell_Patch1 (Verse.AI.Pawn_PathFollower) (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.AI.Pawn_PathFollower.PatherTick_Patch2 (Verse.AI.Pawn_PathFollower) (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Pawn.Tick_Patch4 (Verse.Pawn) Verse.Thing:DoTick () Verse.TickList:Tick () (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.TickManager.DoSingleTick_Patch3 (Verse.TickManager) Verse.TickManager:TickManagerUpdate () (wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Game.UpdatePlay_Patch4 (Verse.Game) Verse.Root_Play:Update ()

I believe I managed to fix it. 


The issue is with HasMaster. I opened the mod in Visual Studio and added a null check to it:
Before:

  Reveal hidden contents

public bool HasMaster
{
    get
    {
        return parentPawn.relations.GetFirstDirectRelationPawn(PawnRelationDefOf.Master) != null;
    }
}
 

After:
 

  Reveal hidden contents

public bool HasMaster
{
    get
    {
        if (parentPawn == null) return false;
        if (parentPawn.relations == null) return false;
        return parentPawn.relations.GetFirstDirectRelationPawn(PawnRelationDefOf.Master) != null;
    }
}
 


And then fixed the PreventSellingPersonal_Patch inside of Family.cs

Before:

  Reveal hidden contents

public static bool PreventSellingPersonal_Patch(ref bool __result, Pawn __instance, ref string reason)
{
    if (__instance.GetComp<Comp_FamilyData>().HasMaster)
    {
        __result = true;
        reason = "Cannot sell a pawn with a master.";
        return false;
    }
    return true;
}
 

After:
 

  Reveal hidden contents

public static bool PreventSellingPersonal_Patch(ref bool __result, Pawn __instance, ref string reason)
{
    var comp = __instance?.GetComp<Comp_FamilyData>();
    if (comp != null && comp.HasMaster)
    {
        __result = true;
        reason = "Cannot sell a pawn with a master.";
        return false;
    }
    return true;
}
 

I'm not sure if this will cause me any issues down the line but the mod was calling for .HasMaster without checking if they had a Compy_FamilyData component and was getting the above exception.... I'm not sure whether or not my pawn was supposed to have a Comp_FamilyData component, but they are neither a master or under a master.

Vehicles & drones don't have family comp, I forgot to add "__instance.HasFamily_PawnData()"

file Family.cs:

lines 71-98 gives comp

lines 692-706 HasMaster

lines 808-819 IsMaster(Pawn master)

line 684 Masters, add/removed when adding/removing servant from master

Posted
18 hours ago, ESeeker said:

Vehicles & drones don't have family comp, I forgot to add "__instance.HasFamily_PawnData()"

file Family.cs:

lines 71-98 gives comp

lines 692-706 HasMaster

lines 808-819 IsMaster(Pawn master)

line 684 Masters, add/removed when adding/removing servant from master

Was neither vehicle nor drone, was my pawn trying to trade with another pawn, neither of which had a master. 

Posted
8 hours ago, SecretAgentClank said:

Was neither vehicle nor drone, was my pawn trying to trade with another pawn, neither of which had a master. 

no the patch is for whether or not pawn in colony can be sold meaning if you have any vehicle/drone in colony the patch would break

also I don't think vehicle/drone can actually trade

 

fixed in 1.8.4

Posted

Hello! Is the interspecies intercompatibility out or being reworked? If it's in, how does it work? I looked at the code and the see the animal/humanlike chances, but not how they are defined apart from being between 0 and 1, or whether they increase with time/experience. Thanks!

Posted
4 hours ago, Sidereal said:

Hello! Is the interspecies intercompatibility out or being reworked? If it's in, how does it work? I looked at the code and the see the animal/humanlike chances, but not how they are defined apart from being between 0 and 1, or whether they increase with time/experience. Thanks!

After I wrote the code I looked at rjw code for this then at bear defs

in rjw compatibility(complex setting) is determined by bodyDef and body size with greater the difference the lower the compatibility factor

the original idea was to increase compatibility between animals with known viable offspring

how ever with rjw complex setting my patch is useless unless I add multiplier nerfing the result

 

the statDefs(default .5) don't change but can be used by other modder to make race/xenotype more or less compatible(with a patch giving all dryad a humanlike compatibility of 1)

r: result from rjw compatibility formula

if value 0 or 1: incompatible or 100% compatibility respectively

if value >= .5: lerp(r, 1, (value-.5)*2)

if value < .5: lerp(r*.1, r, value*2)

 

rjw\<version>\Source\Modules\Pregnancy\Pregnancy_helper.cs, lines 501 for entire calculation, line 525 for method being patched

rjw\<version>\Source\Common\Helpers\SexUtility.cs, line 414 for method being patched

Posted

Can you add the new features/changes added in every new update with a different color? I really like what you are doing but trying to catch what is new is kinda 'gotta read it all' to catch a change. Take care and thanks for the mod!

Posted
On 10/8/2025 at 6:58 PM, ESeeker said:

no the patch is for whether or not pawn in colony can be sold meaning if you have any vehicle/drone in colony the patch would break

also I don't think vehicle/drone can actually trade

 

fixed in 1.8.4

I should further clarify by saying that there was no vehicle or drone in the entire colony at all. 

Ran into another issue with a slave trying to construct...

 

Spoiler

Exception in JobDriver tick for pawn Woundwort driver=JobDriver_ConstructFinishFrame (toilIndex=1) driver.job=(FinishFrame (Job_2278964) A = Thing_Frame_SleepAccelerator665208 Giver = ThinkNode_QueuedJob [workGiverDef: ConstructFinishFrames])
System.NullReferenceException: Object reference not set to an instance of an object
[Ref 22B0718E]
  at FamilyOverhaul.StatPart_SlaveAdv.ValueFor (Verse.Pawn pawn) [0x00007] in <954a005b6f8c48ca8a3f15bfc4665f2b>:0 
  at FamilyOverhaul.StatPart_SlaveAdv.TransformValue (RimWorld.StatRequest req, System.Single& val) [0x0001e] in <954a005b6f8c48ca8a3f15bfc4665f2b>:0 
  at RimWorld.StatWorker.FinalizeValue (RimWorld.StatRequest req, System.Single& val, System.Boolean applyPostProcess) [0x00022] in <24d25868955f4df08b02c73b55f389fe>:0 
  at RimWorld.StatWorker.GetValue (RimWorld.StatRequest req, System.Boolean applyPostProcess) [0x0005c] in <24d25868955f4df08b02c73b55f389fe>:0 
    - TRANSPILER Krkr.RocketMan: IEnumerable`1 RocketMan.Optimizations.StatWorker_Patch:Transpiler(IEnumerable`1 instructions, MethodBase original)
  at RimWorld.StatWorker.GetValue (Verse.Thing thing, System.Boolean applyPostProcess, System.Int32 cacheStaleAfterTicks) [0x0007c] in <24d25868955f4df08b02c73b55f389fe>:0 
  at RimWorld.StatExtension.GetStatValue (Verse.Thing thing, RimWorld.StatDef stat, System.Boolean applyPostProcess, System.Int32 cacheStaleAfterTicks) [0x00006] in <24d25868955f4df08b02c73b55f389fe>:0 
  at RimWorld.JobDriver_ConstructFinishFrame+<>c__DisplayClass8_0.<MakeNewToils>b__1 (System.Int32 delta) [0x0008c] in <24d25868955f4df08b02c73b55f389fe>:0 
    - TRANSPILER OskarPotocki.VEF: IEnumerable`1 VEF.Pawns.VanillaExpandedFramework_JobDriver_ConstructFinishFrame_MakeNewToils_TickAction_Patch:Transpiler(IEnumerable`1 codeInstructions, MethodBase method)
    - TRANSPILER PeteTimesSix.ResearchReinvented: IEnumerable`1 PeteTimesSix.ResearchReinvented.HarmonyPatches.Prototypes.JobDriver_ConstructFinishFrame_MakeNewToils_Patches:JobDriver_ConstructFinishFrame_MakeNewToils_initAction_Transpiler(IEnumerable`1 instructions)
    - TRANSPILER vanillaexpanded.skills: IEnumerable`1 VSE.Stats.StatPatches:FloorStatOptionTranspiler(IEnumerable`1 instructions)
  at Verse.AI.JobDriver.DriverTickInterval (System.Int32 delta) [0x0009f] in <24d25868955f4df08b02c73b55f389fe>:0 
UnityEngine.StackTraceUtility:ExtractStackTrace ()
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Log.Error_Patch3 (string)
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.AI.JobUtility.TryStartErrorRecoverJob_Patch1 (Verse.Pawn,string,System.Exception,Verse.AI.JobDriver)
Verse.AI.JobDriver:DriverTickInterval (int)
Verse.AI.Pawn_JobTracker:JobTrackerTickInterval (int)
Verse.Pawn:TickInterval (int)
Verse.Thing:DoTick ()
Verse.TickList:Tick ()
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.TickManager.DoSingleTick_Patch3 (Verse.TickManager)
Verse.TickManager:TickManagerUpdate ()
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Game.UpdatePlay_Patch4 (Verse.Game)
Verse.Root_Play:Update ()

Will see if I can fix it myself.... 

Posted
15 hours ago, SecretAgentClank said:

I should further clarify by saying that there was no vehicle or drone in the entire colony at all. 

Ran into another issue with a slave trying to construct...

 

  Reveal hidden contents

Exception in JobDriver tick for pawn Woundwort driver=JobDriver_ConstructFinishFrame (toilIndex=1) driver.job=(FinishFrame (Job_2278964) A = Thing_Frame_SleepAccelerator665208 Giver = ThinkNode_QueuedJob [workGiverDef: ConstructFinishFrames])
System.NullReferenceException: Object reference not set to an instance of an object
[Ref 22B0718E]
  at FamilyOverhaul.StatPart_SlaveAdv.ValueFor (Verse.Pawn pawn) [0x00007] in <954a005b6f8c48ca8a3f15bfc4665f2b>:0 
  at FamilyOverhaul.StatPart_SlaveAdv.TransformValue (RimWorld.StatRequest req, System.Single& val) [0x0001e] in <954a005b6f8c48ca8a3f15bfc4665f2b>:0 
  at RimWorld.StatWorker.FinalizeValue (RimWorld.StatRequest req, System.Single& val, System.Boolean applyPostProcess) [0x00022] in <24d25868955f4df08b02c73b55f389fe>:0 
  at RimWorld.StatWorker.GetValue (RimWorld.StatRequest req, System.Boolean applyPostProcess) [0x0005c] in <24d25868955f4df08b02c73b55f389fe>:0 
    - TRANSPILER Krkr.RocketMan: IEnumerable`1 RocketMan.Optimizations.StatWorker_Patch:Transpiler(IEnumerable`1 instructions, MethodBase original)
  at RimWorld.StatWorker.GetValue (Verse.Thing thing, System.Boolean applyPostProcess, System.Int32 cacheStaleAfterTicks) [0x0007c] in <24d25868955f4df08b02c73b55f389fe>:0 
  at RimWorld.StatExtension.GetStatValue (Verse.Thing thing, RimWorld.StatDef stat, System.Boolean applyPostProcess, System.Int32 cacheStaleAfterTicks) [0x00006] in <24d25868955f4df08b02c73b55f389fe>:0 
  at RimWorld.JobDriver_ConstructFinishFrame+<>c__DisplayClass8_0.<MakeNewToils>b__1 (System.Int32 delta) [0x0008c] in <24d25868955f4df08b02c73b55f389fe>:0 
    - TRANSPILER OskarPotocki.VEF: IEnumerable`1 VEF.Pawns.VanillaExpandedFramework_JobDriver_ConstructFinishFrame_MakeNewToils_TickAction_Patch:Transpiler(IEnumerable`1 codeInstructions, MethodBase method)
    - TRANSPILER PeteTimesSix.ResearchReinvented: IEnumerable`1 PeteTimesSix.ResearchReinvented.HarmonyPatches.Prototypes.JobDriver_ConstructFinishFrame_MakeNewToils_Patches:JobDriver_ConstructFinishFrame_MakeNewToils_initAction_Transpiler(IEnumerable`1 instructions)
    - TRANSPILER vanillaexpanded.skills: IEnumerable`1 VSE.Stats.StatPatches:FloorStatOptionTranspiler(IEnumerable`1 instructions)
  at Verse.AI.JobDriver.DriverTickInterval (System.Int32 delta) [0x0009f] in <24d25868955f4df08b02c73b55f389fe>:0 
UnityEngine.StackTraceUtility:ExtractStackTrace ()
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Log.Error_Patch3 (string)
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.AI.JobUtility.TryStartErrorRecoverJob_Patch1 (Verse.Pawn,string,System.Exception,Verse.AI.JobDriver)
Verse.AI.JobDriver:DriverTickInterval (int)
Verse.AI.Pawn_JobTracker:JobTrackerTickInterval (int)
Verse.Pawn:TickInterval (int)
Verse.Thing:DoTick ()
Verse.TickList:Tick ()
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.TickManager.DoSingleTick_Patch3 (Verse.TickManager)
Verse.TickManager:TickManagerUpdate ()
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Game.UpdatePlay_Patch4 (Verse.Game)
Verse.Root_Play:Update ()

Will see if I can fix it myself.... 


This is the solution

 

On 10/6/2025 at 11:35 AM, furel said:

The problems are TransformValue and ExplanationPart, you can't send req.Pawn to ValueFor, you have to use it like in ActiveFor and make req.Thing as a Pawn input, like this:

  Reveal hidden contents
TransformValue(StatRequest req, ref float val)
        {
            if (ActiveFor(req.Thing))
            {
                if (req.Thing is Pawn pawn) 
                {
                  val *= ValueFor(pawn);  
                }
            }
        }

public override string ExplanationPart(StatRequest req)
{
    if (req.HasThing && ActiveFor(req.Thing))
    {
        if (req.Thing is Pawn pawn)
        {
            return "StatsReport_Slave".Translate() + (": x" + ValueFor(pawn).ToStringPercent());
        }        
    }
    return null;
}

 

 

 

Posted
53 minutes ago, furel said:


This is the solution

 

 

thanks, I figured that was the problem but accidentally loaded my main save instead test save so was unable to confirm

Posted

I am also having problems with Family Overhaul 1.6.  My slaves just stand still when asked to tend wounds.  I've just updated to 1.8.6 and hopefully that'll fix it.  This mod worked great in my last colony and for this new one I added Equal Milking and it sounds like that's the problem.  I love the concept of concubines so much.

 

  • subtypes: Maid(butler for male), Acolyte/Squire/Apprentice(probably needs renaming), Pet, Concubine, Broodmother, Breeder, Toy

Could you explain what the differences are?  Or are these just different flavor names for the same type of relationship?

Posted (edited)
3 hours ago, Rimworld Traveller said:

I am also having problems with Family Overhaul 1.6.  My slaves just stand still when asked to tend wounds.  I've just updated to 1.8.6 and hopefully that'll fix it.  This mod worked great in my last colony and for this new one I added Equal Milking and it sounds like that's the problem.  I love the concept of concubines so much.

 

  • subtypes: Maid(butler for male), Acolyte/Squire/Apprentice(probably needs renaming), Pet, Concubine, Broodmother, Breeder, Toy

Could you explain what the differences are?  Or are these just different flavor names for the same type of relationship?

I can report that my slaves can tend wounds just fine in 1.8.6.  Thank you for your hard work!  

 

Edit: The old way of assigning concubines was DevMode "Add Family Relationship" then choosing concubine.   But the concubine option is gone now?  Is "overseer" the same thing?  Concubine used to give the pain a +20 opinion of each other, which was useful to get new slaves to do lovin' with their master. 

 

Edit again: ESeeker explains how to do it in the updated OP and it works super well!  I "added" new master/servant relationship and only had the choice of Maid or Acolyte. I chose acolyte then clicked "edit relationship" and concubine was an option!  

Edited by Rimworld Traveller
Posted
On 10/9/2025 at 4:54 PM, ESeeker said:

After I wrote the code I looked at rjw code for this then at bear defs

in rjw compatibility(complex setting) is determined by bodyDef and body size with greater the difference the lower the compatibility factor

the original idea was to increase compatibility between animals with known viable offspring

how ever with rjw complex setting my patch is useless unless I add multiplier nerfing the result

 

the statDefs(default .5) don't change but can be used by other modder to make race/xenotype more or less compatible(with a patch giving all dryad a humanlike compatibility of 1)

r: result from rjw compatibility formula

if value 0 or 1: incompatible or 100% compatibility respectively

if value >= .5: lerp(r, 1, (value-.5)*2)

if value < .5: lerp(r*.1, r, value*2)

 

rjw\<version>\Source\Modules\Pregnancy\Pregnancy_helper.cs, lines 501 for entire calculation, line 525 for method being patched

rjw\<version>\Source\Common\Helpers\SexUtility.cs, line 414 for method being patched

 

Thanks! Understood.

So at the moment it is not active at all, or only working for animals to be compatible with humans and not the other way around? I see the statdef for animalcompatibility is not as complete as for humancompatibility? Which I guess would explain why I could not find it in pawn's stats

Posted
42 minutes ago, Sidereal said:

 

Thanks! Understood.

So at the moment it is not active at all, or only working for animals to be compatible with humans and not the other way around? I see the statdef for animalcompatibility is not as complete as for humancompatibility? Which I guess would explain why I could not find it in pawn's stats

slight clarification, both statDefs are the same but only one gets used based on if other pawn is humanlike/animal

if used stat value is 0 for either pawn then they're incompatible

the 2 values from the pawns are merged with lerp(dad, mom, .6)

 

example: dad is humanlike, mom is dryad, OV = value form rjw compatibility(complex setting)

values: dad = .5(default), mom = 1(dad is humanlike so use humancompatibility)

formula: lerp(.5, 1, .6) = .8 then (.8*2)-1 = .6 then lerp(OV, 1, .6)

 

will add bonus for trainableDefs from eltoro's bestiality mod so the statDefs aren't essentially useless

Posted (edited)

Apparel Tweaks For RJW

 

Breaks something in the display of bondage items the likes from RJW-Extension. Maybe something to do with the bondage layer, not sure. Doesn't display any of the items from RJW-EX in either sex or just a pawn walking around. Tried messing with the mod settings, but that doesn't seem to affect this issue. Removed the mod from the load order and all of the items display correctly. Currently just cycling through the releases to see if any worked at some point. On current RJW and 1.6

 

edit: process of elimination, seems like something in 1.6.1.2 broke this functionality. 1.6.1.1 displays the aforementioned items just fine.

Edited by Bignickdigger69
Posted
7 hours ago, Bignickdigger69 said:

Apparel Tweaks For RJW

 

Breaks something in the display of bondage items the likes from RJW-Extension. Maybe something to do with the bondage layer, not sure. Doesn't display any of the items from RJW-EX in either sex or just a pawn walking around. Tried messing with the mod settings, but that doesn't seem to affect this issue. Removed the mod from the load order and all of the items display correctly. Currently just cycling through the releases to see if any worked at some point. On current RJW and 1.6

 

edit: process of elimination, seems like something in 1.6.1.2 broke this functionality. 1.6.1.1 displays the aforementioned items just fine.

in 1.6.1.2 I merged s16 Extension's underwhere layer into UnderWhere's

 

looking at rjw-ex mod it's apparel uses both mods layers but since I removed s16's meaning it would try and apply UnderWhere's layer twice

Posted
14 hours ago, ESeeker said:

in 1.6.1.2 I merged s16 Extension's underwhere layer into UnderWhere's

 

looking at rjw-ex mod it's apparel uses both mods layers but since I removed s16's meaning it would try and apply UnderWhere's layer twice

1.6.1.5 is still borked. Still not displaying chastity belts. Didn't do extensive testing though. Thanks for taking a crack at it!

Posted
On 10/14/2025 at 10:38 PM, Bignickdigger69 said:

Apparel Tweaks For RJW

 

Breaks something in the display of bondage items the likes from RJW-Extension. Maybe something to do with the bondage layer, not sure. Doesn't display any of the items from RJW-EX in either sex or just a pawn walking around. Tried messing with the mod settings, but that doesn't seem to affect this issue. Removed the mod from the load order and all of the items display correctly. Currently just cycling through the releases to see if any worked at some point. On current RJW and 1.6

 

edit: process of elimination, seems like something in 1.6.1.2 broke this functionality. 1.6.1.1 displays the aforementioned items just fine.

wait a sec 1.6.1.2? the merge was in 1.6.1.3

 

looking git changes made in 1.6.1.2 I found:

if (!apparel?.TryGetComp<CompApparelVisibility>()?.IsVisibleOnPawns() ?? true) <-- changed false to true in 1.6.1.2

    return __result = false;

return true;

 

the comp only given to things with "Apparel" thingClass and it's likely RJW Extension apparel use different thingClass

Posted
51 minutes ago, ESeeker said:

wait a sec 1.6.1.2? the merge was in 1.6.1.3

 

looking git changes made in 1.6.1.2 I found:

if (!apparel?.TryGetComp<CompApparelVisibility>()?.IsVisibleOnPawns() ?? true) <-- changed false to true in 1.6.1.2

    return __result = false;

return true;

 

the comp only given to things with "Apparel" thingClass and it's likely RJW Extension apparel use different thingClass

Seems to have done the trick! The belts now display normally, and during animation if the settings are set that way.

But since 1.6.1.5 two new red errors are thrown out during startup. Due to me not running S16 it seems.

Spoiler

XML error: <xpath>Defs/ThingDef/apparel/layers[li="S16_Underwear" and li="Underwear"]/li[text()="S16_Underwear"]</xpath> doesn't correspond to any field in type PatchOperation. Context: <li Class="PatchOperationRemoved"><xpath>Defs/ThingDef/apparel/layers[li="S16_Underwear" and li="Underwear"]/li[text()="S16_Underwear"]</xpath></li>
UnityEngine.StackTraceUtility:ExtractStackTrace ()
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Log.Error_Patch1 (string)
Verse.XmlToObjectUtils:DoFieldSearch (System.Type,System.Xml.XmlNode,System.Xml.XmlNode)
Verse.DirectXmlToObject:ObjectFromXml<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ListFromXml<Verse.PatchOperation> (System.Xml.XmlNode)
Verse.DirectXmlToObject:ListFromXmlReflection<Verse.PatchOperation> (System.Xml.XmlNode)
Verse.DirectXmlToObject:ObjectFromXml<System.Collections.Generic.List`1<Verse.PatchOperation>> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXmlReflection<System.Collections.Generic.List`1<Verse.PatchOperation>> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXml<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXmlReflection<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXml<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ListFromXml<Verse.PatchOperation> (System.Xml.XmlNode)
Verse.DirectXmlToObject:ListFromXmlReflection<Verse.PatchOperation> (System.Xml.XmlNode)
Verse.DirectXmlToObject:ObjectFromXml<System.Collections.Generic.List`1<Verse.PatchOperation>> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXmlReflection<System.Collections.Generic.List`1<Verse.PatchOperation>> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXml<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXmlReflection<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXml<Verse.PatchOperation> (System.Xml.XmlNode,bool)
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.ModContentPack.LoadPatches_Patch1 (Verse.ModContentPack)
Verse.ModContentPack:get_Patches ()
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.LoadedModManager.ErrorCheckPatches_Patch1 ()
Verse.LoadedModManager:LoadAllActiveMods (bool)
Verse.PlayDataLoader:DoPlayLoad ()
Verse.PlayDataLoader:LoadAllPlayData (bool)
Verse.Root/<>c:<Start>b__10_1 ()
Verse.LongEventHandler:RunEventFromAnotherThread (System.Action)
Verse.LongEventHandler/<>c:<UpdateCurrentAsynchronousEvent>b__28_0 ()
System.Threading.ThreadHelper:ThreadStart_Context (object)
System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool)
System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool)
System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object)
System.Threading.ThreadHelper:ThreadStart ()

 

 and

Spoiler

Could not find type named PatchOperationRemoved from node <li Class="PatchOperationRemoved"><xpath>Defs/ThingDef/apparel/layers[li="S16_Underwear" and li="Underwear"]/li[text()="S16_Underwear"]</xpath></li>
UnityEngine.StackTraceUtility:ExtractStackTrace ()
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.Log.Error_Patch1 (string)
Verse.DirectXmlToObject:ClassTypeOf<Verse.PatchOperation> (System.Xml.XmlNode)
Verse.DirectXmlToObject:ObjectFromXml<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ListFromXml<Verse.PatchOperation> (System.Xml.XmlNode)
Verse.DirectXmlToObject:ListFromXmlReflection<Verse.PatchOperation> (System.Xml.XmlNode)
Verse.DirectXmlToObject:ObjectFromXml<System.Collections.Generic.List`1<Verse.PatchOperation>> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXmlReflection<System.Collections.Generic.List`1<Verse.PatchOperation>> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXml<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXmlReflection<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXml<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ListFromXml<Verse.PatchOperation> (System.Xml.XmlNode)
Verse.DirectXmlToObject:ListFromXmlReflection<Verse.PatchOperation> (System.Xml.XmlNode)
Verse.DirectXmlToObject:ObjectFromXml<System.Collections.Generic.List`1<Verse.PatchOperation>> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXmlReflection<System.Collections.Generic.List`1<Verse.PatchOperation>> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXml<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXmlReflection<Verse.PatchOperation> (System.Xml.XmlNode,bool)
Verse.DirectXmlToObject:ObjectFromXml<Verse.PatchOperation> (System.Xml.XmlNode,bool)
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.ModContentPack.LoadPatches_Patch1 (Verse.ModContentPack)
Verse.ModContentPack:get_Patches ()
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition:Verse.LoadedModManager.ErrorCheckPatches_Patch1 ()
Verse.LoadedModManager:LoadAllActiveMods (bool)
Verse.PlayDataLoader:DoPlayLoad ()
Verse.PlayDataLoader:LoadAllPlayData (bool)
Verse.Root/<>c:<Start>b__10_1 ()
Verse.LongEventHandler:RunEventFromAnotherThread (System.Action)
Verse.LongEventHandler/<>c:<UpdateCurrentAsynchronousEvent>b__28_0 ()
System.Threading.ThreadHelper:ThreadStart_Context (object)
System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool)
System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool)
System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object)
System.Threading.ThreadHelper:ThreadStart ()

 

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...