protected void AddRelationships(Dictionary <CustomPawn, Pawn> lookup, IEnumerable <CustomRelationship> relationships) { PawnGenerationRequest request = new PawnGenerationRequest(); foreach (CustomRelationship r in RelationshipManager.ExplicitRelationships) { PawnRelationWorker worker = this.relationshipManager.FindPawnRelationWorker(r.def); if (worker.GetType().GetMethod("CreateRelation", BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) == null) { continue; } Pawn source = null; Pawn target = null; if (!lookup.TryGetValue(r.source, out source)) { Log.Warning("Prepare Carefully could not find source pawn when trying to create relationship (" + r.def.defName + "): " + r.source.Name); continue; } if (!lookup.TryGetValue(r.target, out target)) { Log.Warning("Prepare Carefully could not find target pawn when trying to create relationship (" + r.def.defName + "): " + r.target.Name); continue; } // TODO: If either of those lookups are failing, we're not tracking pawns properly // somewhere. I've seen those lookups fail after deleting colonists (but not // consistently). Should track down the root cause. worker.CreateRelation(source, target, ref request); } }
public PawnRelationWorker FindPawnRelationWorker(PawnRelationDef def) { CarefullyPawnRelationDef carefullyDef = DefDatabase <CarefullyPawnRelationDef> .GetNamedSilentFail(def.defName); if (carefullyDef == null || carefullyDef.workerClass == null) { return(def.Worker); } else { PawnRelationWorker worker = carefullyDef.Worker; if (worker != null) { Log.Message("Returned carefully worker for " + def.defName + ", " + worker.GetType().FullName); return(carefullyDef.Worker); } else { return(def.Worker); } } }