private static bool HourlyTickPrefix(CraftingCampaignBehavior __instance) { if (ModSettings.Settings.CraftingConfig.Enabled) { var instanceType = __instance.GetType(); var craftingRecords = instanceType.GetField("_heroCraftingRecords", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance); var heroKeyCollection = craftingRecords.GetType().GetProperty("Keys", BindingFlags.Instance | BindingFlags.Public).GetValue(craftingRecords); var heroKeyCount = (int)heroKeyCollection.GetType().GetProperty("Count", BindingFlags.Instance | BindingFlags.Public).GetValue(heroKeyCollection); var heroKeyArray = new Hero[heroKeyCount]; heroKeyCollection.GetType().GetMethod("CopyTo", BindingFlags.Instance | BindingFlags.Public).Invoke(heroKeyCollection, new object[] { heroKeyArray, 0 }); foreach (var heroKey in heroKeyArray) { var tryGetValueParams = new object[] { heroKey, null }; var tryGetValueResult = craftingRecords.GetType().GetMethod("TryGetValue", BindingFlags.Instance | BindingFlags.Public).Invoke(craftingRecords, tryGetValueParams); if ((bool)tryGetValueResult) { var heroCraftingRecord = tryGetValueParams[1]; var craftingStaminaField = heroCraftingRecord.GetType().GetField("CraftingStamina", BindingFlags.Instance | BindingFlags.Public); var craftingStamina = (int)craftingStaminaField.GetValue(heroCraftingRecord); if (craftingStamina < 100) { int recoveryRate; if (heroKey.PartyBelongedTo?.CurrentSettlement != null) { recoveryRate = ModSettings.Settings.CraftingConfig.HourlySettlementStaminaRecoveryRate; } else { recoveryRate = ModSettings.Settings.CraftingConfig.HourlyMovingStaminaRecoveryRate; } craftingStaminaField.SetValue(heroCraftingRecord, Math.Min(100, craftingStamina + recoveryRate)); } } } return(false); } else { return(true); } }
public static string UnlockAllParts(List <string> strings) { if (Campaign.Current == null) { return("Campaign was not started."); } CraftingCampaignBehavior campaignBehavior = Campaign.Current.GetCampaignBehavior <CraftingCampaignBehavior>(); MethodInfo method = campaignBehavior.GetType().GetMethod("OpenPart", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (method == null) { return("Failed to locate method."); } for (int i = 0; i < CraftingPiece.All.Count; i++) { method.Invoke(campaignBehavior, new object[] { CraftingPiece.All[i] }); } return("Unlocked all crafting pieces."); }