public static T PackFood <T>(string fn, Pawn pawn, Thing thing = null) where T : struct { if (_packfood == null) { _packfood = new JobGiver_PackFood(); } MethodInfo m = typeof(JobGiver_PackFood).GetMethod(fn, BindingFlags.Instance | BindingFlags.NonPublic); if (m.ReturnType != typeof(T)) { throw new ArgumentException(); } var args = m.GetParameters() .Select <ParameterInfo, object>(delegate(ParameterInfo p) { var pT = p.ParameterType; if (pT == typeof(Pawn)) { return(pawn); } else if (pT == typeof(Thing)) { return(thing); } else { throw new ArgumentException("type now allowed"); } }).ToArray(); return((T)m.Invoke(_packfood, args)); }
static bool Prefix(JobGiver_PackFood __instance, ref Job __result, Pawn pawn) { if (!Settings.fun_police || pawn.timetable == null || pawn.timetable.CurrentAssignment != TimeAssignmentDefOf.Joy && (pawn.timetable.CurrentAssignment != TimeAssignmentDefOf.Sleep || pawn.needs != null && pawn.needs.rest != null && pawn.needs.rest.CurLevel <= 0.3f)) { return(true); } if (pawn.inventory == null) { __result = null; return(false); } float invNutrition = (float)LGetInventoryPackableFoodNutrition.Invoke(__instance, new object[] { pawn }); if (invNutrition > 0.4f) { __result = null; return(false); } if (pawn.Map.resourceCounter.TotalHumanEdibleNutrition < pawn.Map.mapPawns.ColonistsSpawnedCount * 1.5f) { __result = null; return(false); } Thing thing = null; ref Thing foodSource = ref thing;