[1.0] [WIP] Replimat - Distributed food replicator system

Started by sumghai, August 16, 2017, 05:39:21 AM

Previous topic - Next topic

Canute

Hey you job got priority, since you don't have an own replimat you need it to to have food ! :-)

sumghai

Progress Report, 30 September 2018

Hopper FX mostly implemented. Still need to add looping sound FX.



A nicer GIFV version.

sumghai

Progress Report, 6 October 2018

  • Recompiled for RimWorld 1.0.2047 unstable build
  • Added Hopper looping SFX
  • Added translation support (with Traditional Chinese dictionary)
Todo:

  • Re-add "Ate Replicated Food" ThoughtDef triggering when a pawn with the Sensitive Taster trait uses a Replimat (previously removed by as part of a prior refactoring)
  • (WIP) Move Meal Manager dialog to Computer
  • Implement Meal Manager dialog

Sixdd

Always great to see progress, can't wait for the 1.0 release :D

Chicken Plucker

Loving the effects, some high budget Hollywood sci-fi shenanigans going on here, well done on the progress!

Phenomphear

Literally made an account to say I must have this and it looks amazing! Are there more mods here then on steam and if so, why?

Sixdd

Is there any way to make the food decompiler thingy suck down full stacks at a time? I have one making the sound effect non-stop because I have 20 pawns and at least a dozen animals all eating from this system and the sound effect gets annoying after about 20 hours. Even still this mod is great, thank you for creating it :D

sumghai

Quote from: Sixdd on January 29, 2019, 11:16:39 PM
Is there any way to make the food decompiler thingy suck down full stacks at a time? I have one making the sound effect non-stop because I have 20 pawns and at least a dozen animals all eating from this system and the sound effect gets annoying after about 20 hours.

Yes, I've observed this as well in playthroughs with large colonies.

I do want to finish up this mod eventually, but I'm heavily reliant on Dubwise's help with the coding, and AFAIK he has asked me to wait until he has finished remaking MarsX for RimWorld, so I haven't bought this up again just yet.

sumghai

Progress Report, 8 March 2019 - see first post for WIP download

Apologies again for the radio silence! Both Dubwise and I had quite a few different projects and commitments going on, and it took a while before we could revisit Replimat yet again.

To start off, Dubwise significantly revised the underlying code to be more efficient and in line with changes to the vanilla Nutrient Paste Dispenser, since the Replimat Terminals are essentially a more advanced version of the NPDs.

Next, after much discussion, we decided that rather than having a custom meal management interface, we would simply use the vanilla food restriction system, so the Terminals will now only replicate food allowed by each Pawn's individual food restriction policy.

By default, pawns would choose the highest quality meals, but there is a Mod Settings option that would allow pawns to randomly pick meals of any quality - this is to cater for third-party food mods like Vegetable Garden, that has a wide range of simple, fine and lavish meals and snacks.

I added the Storage tab to the Animal Feeder, so players can customize the storage priority of the Kibble generated/stored within.

Finally, Terminals can now be used to synthesize multiple stacks of Packaged Survival Meals, so that players can prepare for caravans or stock up for emergencies. Each Terminal comes with a button:



A warning message appears if the selected Terminal is not connected to a powerNet, or if tanks don't have enough feedstock:



Otherwise, a modal dialog with a slider appears, allowing players to adjust how many Survival Meals to replicate. The maximum number that can be made at a time is usually 30, but this can decrease if the stored feedstock is low:



Once players click OK, the desired number of Survival Meals are synthesized:






So what else is missing?


  • Dubwise is investigating a bug where pawns will not be able to use the Terminals their food restriction policy forbids Nutrient Paste. We suspect this is a consequence of basing the Terminals on the vanilla paste dispenser, but we haven't been able to track down the exact cause.
  • Re-adding some minor features removed during the last round of refactoring, such as the "Sensitive Taster" trait which gives pawns a minor mood debuff for using the Replimat (inspired by minor characters from Star Trek who claim that handmade meals taste better than synthesized food)
  • Better integration with Orion's Hospitality Mod. I did some brief testing just now, and visitors can use the player colony's Terminals, but only after they run out of the food they bought with them (which I had to artificially simulate in dev mode). Ideally, visitor pawns should prioritize using a host colony's Terminals over their own food, so I'm investigating different approaches to this.

Other than that, this mod should be relatively stable now for a WIP - have fun feeding your large colonies!

sidfu

looks like its incomp with the smater food selection mod
Exception in Verse.AI.ThinkNode_PrioritySorter TryIssueJobPackage: System.Exception: Smarter_Food_Selection: Exception when fetching. (getter=Hoath eater=Hoath)
System.ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
  at System.Collections.Generic.List`1[Verse.Thing].get_Item (Int32 index) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.Detours.Building_NutrientPasteDispenser_Detour.GetBestMealThoughtsFor (RimWorld.Building_NutrientPasteDispenser self, Verse.Pawn eater) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.FoodScoreUtils.FoodScoreFor (WM.SmarterFoodSelection.Policy policy, Verse.Pawn eater, Verse.Pawn getter, Verse.Thing food, Boolean noDistanceFactor, Boolean quickScore) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.FoodUtils.MakeRatedFoodListFromThingList (IEnumerable`1 list, Verse.Pawn eater, Verse.Pawn getter, WM.SmarterFoodSelection.Policy policy, Boolean doScoreSort) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.FoodUtils.MakeRatedFoodListForPawn (Verse.Map map, Verse.Pawn eater, Verse.Pawn getter, WM.SmarterFoodSelection.Policy policy, System.Collections.Generic.List`1& foodList, Boolean canUseInventory, Boolean allowForbidden) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.Detours.FoodUtility.TryFindBestFoodSourceFor.Internal (Verse.Pawn getter, Verse.Pawn eater, Boolean desperate, Verse.Thing& foodSource, Verse.ThingDef& foodDef, Boolean canRefillDispenser, Boolean canUseInventory, Boolean allowForbidden, Boolean allowCorpse, WM.SmarterFoodSelection.Policy forcedPolicy) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.Detours.FoodUtility.TryFindBestFoodSourceFor._Postfix (System.Boolean& __state, System.Boolean& __result, Verse.Pawn getter, Verse.Pawn eater, Boolean desperate, Verse.Thing& foodSource, Verse.ThingDef& foodDef, Boolean canRefillDispenser, Boolean canUseInventory, Boolean allowForbidden, Boolean allowCorpse) [0x00000] in <filename unknown>:0
  at System.Collections.Generic.List`1[Verse.Thing].get_Item (Int32 index) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.Detours.Building_NutrientPasteDispenser_Detour.GetBestMealThoughtsFor (RimWorld.Building_NutrientPasteDispenser self, Verse.Pawn eater) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.FoodScoreUtils.FoodScoreFor (WM.SmarterFoodSelection.Policy policy, Verse.Pawn eater, Verse.Pawn getter, Verse.Thing food, Boolean noDistanceFactor, Boolean quickScore) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.FoodUtils.MakeRatedFoodListFromThingList (IEnumerable`1 list, Verse.Pawn eater, Verse.Pawn getter, WM.SmarterFoodSelection.Policy policy, Boolean doScoreSort) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.FoodUtils.MakeRatedFoodListForPawn (Verse.Map map, Verse.Pawn eater, Verse.Pawn getter, WM.SmarterFoodSelection.Policy policy, System.Collections.Generic.List`1& foodList, Boolean canUseInventory, Boolean allowForbidden) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.Detours.FoodUtility.TryFindBestFoodSourceFor.Internal (Verse.Pawn getter, Verse.Pawn eater, Boolean desperate, Verse.Thing& foodSource, Verse.ThingDef& foodDef, Boolean canRefillDispenser, Boolean canUseInventory, Boolean allowForbidden, Boolean allowCorpse, WM.SmarterFoodSelection.Policy forcedPolicy) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.Detours.FoodUtility.TryFindBestFoodSourceFor._Postfix (System.Boolean& __state, System.Boolean& __result, Verse.Pawn getter, Verse.Pawn eater, Boolean desperate, Verse.Thing& foodSource, Verse.ThingDef& foodDef, Boolean canRefillDispenser, Boolean canUseInventory, Boolean allowForbidden, Boolean allowCorpse) [0x00000] in <filename unknown>:0  ---> System.ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
  at System.Collections.Generic.List`1[Verse.Thing].get_Item (Int32 index) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.Detours.Building_NutrientPasteDispenser_Detour.GetBestMealThoughtsFor (RimWorld.Building_NutrientPasteDispenser self, Verse.Pawn eater) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.FoodScoreUtils.FoodScoreFor (WM.SmarterFoodSelection.Policy policy, Verse.Pawn eater, Verse.Pawn getter, Verse.Thing food, Boolean noDistanceFactor, Boolean quickScore) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.FoodUtils.MakeRatedFoodListFromThingList (IEnumerable`1 list, Verse.Pawn eater, Verse.Pawn getter, WM.SmarterFoodSelection.Policy policy, Boolean doScoreSort) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.FoodUtils.MakeRatedFoodListForPawn (Verse.Map map, Verse.Pawn eater, Verse.Pawn getter, WM.SmarterFoodSelection.Policy policy, System.Collections.Generic.List`1& foodList, Boolean canUseInventory, Boolean allowForbidden) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.Detours.FoodUtility.TryFindBestFoodSourceFor.Internal (Verse.Pawn getter, Verse.Pawn eater, Boolean desperate, Verse.Thing& foodSource, Verse.ThingDef& foodDef, Boolean canRefillDispenser, Boolean canUseInventory, Boolean allowForbidden, Boolean allowCorpse, WM.SmarterFoodSelection.Policy forcedPolicy) [0x00000] in <filename unknown>:0
  at WM.SmarterFoodSelection.Detours.FoodUtility.TryFindBestFoodSourceFor._Postfix (System.Boolean& __state, System.Boolean& __result, Verse.Pawn getter, Verse.Pawn eater, Boolean desperate, Verse.Thing& foodSource, Verse.ThingDef& foodDef, Boolean canRefillDispenser, Boolean canUseInventory, Boolean allowForbidden, Boolean allowCorpse) [0x00000] in <filename unknown>:0
  --- End of inner exception stack trace ---
at WM.SmarterFoodSelection.Detours.FoodUtility.TryFindBestFoodSourceFor._Postfix (bool&,bool&,Verse.Pawn,Verse.Pawn,bool,Verse.Thing&,Verse.ThingDef&,bool,bool,bool,bool) <0x00287>
at (wrapper dynamic-method) RimWorld.FoodUtility.TryFindBestFoodSourceFor_Patch3 (Verse.Pawn,Verse.Pawn,bool,Verse.Thing&,Verse.ThingDef&,bool,bool,bool,bool,bool,bool,bool) <0x00757>
at RimWorld.JobGiver_GetFood.TryGiveJob (Verse.Pawn) <0x001f7>
at (wrapper dynamic-method) Verse.AI.ThinkNode_JobGiver.TryIssueJobPackage_Patch1 (object,Verse.Pawn,Verse.AI.JobIssueParams) <0x0004b>
at Verse.AI.ThinkNode_PrioritySorter.TryIssueJobPackage (Verse.Pawn,Verse.AI.JobIssueParams) <0x0056b>

Verse.Log:Error(String, Boolean)
Verse.AI.ThinkNode_PrioritySorter:TryIssueJobPackage(Pawn, JobIssueParams)
Verse.AI.ThinkNode_Priority:TryIssueJobPackage(Pawn, JobIssueParams)
Verse.AI.ThinkNode_Tagger:TryIssueJobPackage(Pawn, JobIssueParams)
Verse.AI.ThinkNode_Subtree:TryIssueJobPackage(Pawn, JobIssueParams)
Verse.AI.ThinkNode_Priority:TryIssueJobPackage(Pawn, JobIssueParams)
Verse.AI.ThinkNode_Conditional:TryIssueJobPackage(Pawn, JobIssueParams)
Verse.AI.ThinkNode_Priority:TryIssueJobPackage(Pawn, JobIssueParams)
Verse.AI.Pawn_JobTracker:DetermineNextJob_Patch5(Object, ThinkTreeDef&)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.Pawn_JobTracker:JobTrackerTick()
Verse.Pawn:Tick_Patch1(Object)
Verse.TickList:Tick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:UpdatePlay()
Verse.Root_Play:Update()

BB started 10 jobs in one tick. newJob=Ingest (Job_3829) A=Thing_ReplimatTerminal62161 jobGiver=RimWorld.JobGiver_GetFood jobList=(Ingest (Job_3809) A=Thing_ReplimatTerminal62161) (Ingest (Job_3811) A=Thing_ReplimatTerminal62161) (Ingest (Job_3813) A=Thing_ReplimatTerminal62161) (Ingest (Job_3815) A=Thing_ReplimatTerminal62161) (Ingest (Job_3817) A=Thing_ReplimatTerminal62161) (Ingest (Job_3819) A=Thing_ReplimatTerminal62161) (Ingest (Job_3821) A=Thing_ReplimatTerminal62161) (Ingest (Job_3823) A=Thing_ReplimatTerminal62161) (Ingest (Job_3825) A=Thing_ReplimatTerminal62161) (Ingest (Job_3827) A=Thing_ReplimatTerminal62161) (Ingest (Job_3829) A=Thing_ReplimatTerminal62161)  lastJobGiver=RimWorld.JobGiver_GetFood
Verse.Log:Error(String, Boolean)
Verse.AI.JobUtility:TryStartErrorRecoverJob(Pawn, String, Exception, JobDriver)
Verse.AI.Pawn_JobTracker:StartJob_Patch2(Object, Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.JobDriver:EndJobWith(JobCondition)
WM.SmarterFoodSelection.Detours.Toils_Ingest.<>c__DisplayClass1_0:<Postfix>b__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.JobDriver:Notify_PatherArrived()
Verse.AI.Pawn_PathFollower:PatherArrived()
Verse.AI.Pawn_PathFollower:StartPath(LocalTargetInfo, PathEndMode)
Verse.AI.<GotoThing>c__AnonStorey0:<>m__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.Pawn_JobTracker:StartJob_Patch2(Object, Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.JobDriver:EndJobWith(JobCondition)
WM.SmarterFoodSelection.Detours.Toils_Ingest.<>c__DisplayClass1_0:<Postfix>b__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.JobDriver:Notify_PatherArrived()
Verse.AI.Pawn_PathFollower:PatherArrived()
Verse.AI.Pawn_PathFollower:StartPath(LocalTargetInfo, PathEndMode)
Verse.AI.<GotoThing>c__AnonStorey0:<>m__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.Pawn_JobTracker:StartJob_Patch2(Object, Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.JobDriver:EndJobWith(JobCondition)
WM.SmarterFoodSelection.Detours.Toils_Ingest.<>c__DisplayClass1_0:<Postfix>b__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.JobDriver:Notify_PatherArrived()
Verse.AI.Pawn_PathFollower:PatherArrived()
Verse.AI.Pawn_PathFollower:StartPath(LocalTargetInfo, PathEndMode)
Verse.AI.<GotoThing>c__AnonStorey0:<>m__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.Pawn_JobTracker:StartJob_Patch2(Object, Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.JobDriver:EndJobWith(JobCondition)
WM.SmarterFoodSelection.Detours.Toils_Ingest.<>c__DisplayClass1_0:<Postfix>b__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.JobDriver:Notify_PatherArrived()
Verse.AI.Pawn_PathFollower:PatherArrived()
Verse.AI.Pawn_PathFollower:StartPath(LocalTargetInfo, PathEndMode)
Verse.AI.<GotoThing>c__AnonStorey0:<>m__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.Pawn_JobTracker:StartJob_Patch2(Object, Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.JobDriver:EndJobWith(JobCondition)
WM.SmarterFoodSelection.Detours.Toils_Ingest.<>c__DisplayClass1_0:<Postfix>b__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.JobDriver:Notify_PatherArrived()
Verse.AI.Pawn_PathFollower:PatherArrived()
Verse.AI.Pawn_PathFollower:StartPath(LocalTargetInfo, PathEndMode)
Verse.AI.<GotoThing>c__AnonStorey0:<>m__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.Pawn_JobTracker:StartJob_Patch2(Object, Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.JobDriver:EndJobWith(JobCondition)
WM.SmarterFoodSelection.Detours.Toils_Ingest.<>c__DisplayClass1_0:<Postfix>b__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.JobDriver:Notify_PatherArrived()
Verse.AI.Pawn_PathFollower:PatherArrived()
Verse.AI.Pawn_PathFollower:StartPath(LocalTargetInfo, PathEndMode)
Verse.AI.<GotoThing>c__AnonStorey0:<>m__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.Pawn_JobTracker:StartJob_Patch2(Object, Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.JobDriver:EndJobWith(JobCondition)
WM.SmarterFoodSelection.Detours.Toils_Ingest.<>c__DisplayClass1_0:<Postfix>b__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.JobDriver:Notify_PatherArrived()
Verse.AI.Pawn_PathFollower:PatherArrived()
Verse.AI.Pawn_PathFollower:StartPath(LocalTargetInfo, PathEndMode)
Verse.AI.<GotoThing>c__AnonStorey0:<>m__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.Pawn_JobTracker:StartJob_Patch2(Object, Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.JobDriver:EndJobWith(JobCondition)
WM.SmarterFoodSelection.Detours.Toils_Ingest.<>c__DisplayClass1_0:<Postfix>b__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.JobDriver:Notify_PatherArrived()
Verse.AI.Pawn_PathFollower:PatherArrived()
Verse.AI.Pawn_PathFollower:StartPath(LocalTargetInfo, PathEndMode)
Verse.AI.<GotoThing>c__AnonStorey0:<>m__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.Pawn_JobTracker:StartJob_Patch2(Object, Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.JobDriver:EndJobWith(JobCondition)
WM.SmarterFoodSelection.Detours.Toils_Ingest.<>c__DisplayClass1_0:<Postfix>b__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.JobDriver:Notify_PatherArrived()
Verse.AI.Pawn_PathFollower:PatherArrived()
Verse.AI.Pawn_PathFollower:StartPath(LocalTargetInfo, PathEndMode)
Verse.AI.<GotoThing>c__AnonStorey0:<>m__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.Pawn_JobTracker:StartJob_Patch2(Object, Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.JobDriver:EndJobWith(JobCondition)
WM.SmarterFoodSelection.Detours.Toils_Ingest.<>c__DisplayClass1_0:<Postfix>b__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.JobDriver:Notify_PatherArrived()
Verse.AI.Pawn_PathFollower:PatherArrived()
Verse.AI.Pawn_PathFollower:StartPath(LocalTargetInfo, PathEndMode)
Verse.AI.<GotoThing>c__AnonStorey0:<>m__0()
Verse.AI.JobDriver:TryActuallyStartNextToil()
Verse.AI.JobDriver:ReadyForNextToil()
Verse.AI.Pawn_JobTracker:StartJob_Patch2(Object, Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.Pawn_JobTracker:JobTrackerTick()
Verse.Pawn:Tick_Patch1(Object)
Verse.TickList:Tick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:UpdatePlay()
Verse.Root_Play:Update()


sumghai

Quote from: sidfu on March 13, 2019, 12:31:04 AM
looks like its incomp with the smater food selection mod
From a cursory examination of Smarter Food Selection's mod features and codebase, it looks like it's fighting with Replimat over who gets to patch which food-related JobDrivers. And AFAIK, Smart Food Selection has its own proprietary way of controlling individual pawn food policy, whereas Replimat relies on the vanilla food restriction system.

In essence, both are competing mods, so I don't think Dubwise and I will plan to add compatibility for Replimat. Sorry!

sumghai